@fabasoad/sarif-to-slack 1.3.4 → 1.4.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.
Files changed (148) hide show
  1. package/.github/workflows/release.yml +1 -1
  2. package/.github/workflows/security.yml +1 -0
  3. package/.github/workflows/send-sarif-to-slack.yml +39 -15
  4. package/.pre-commit-config.yaml +4 -4
  5. package/.tool-versions +1 -1
  6. package/Makefile +1 -1
  7. package/README.md +8 -7
  8. package/api-extractor.json +2 -2
  9. package/dist/Logger.js +40 -30
  10. package/dist/SarifToSlackClient.d.ts +0 -1
  11. package/dist/SarifToSlackClient.d.ts.map +1 -1
  12. package/dist/SarifToSlackClient.js +11 -8
  13. package/dist/globalState.d.ts +2 -0
  14. package/dist/globalState.d.ts.map +1 -0
  15. package/dist/globalState.js +2 -0
  16. package/dist/index.cjs +118 -81
  17. package/dist/index.d.ts +529 -6
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +9 -2
  20. package/dist/model/Finding.js +7 -5
  21. package/dist/model/FindingArray.js +1 -1
  22. package/dist/model/SendIf.js +1 -1
  23. package/dist/model/SlackMessage.js +6 -6
  24. package/dist/model/color/Color.d.ts.map +1 -1
  25. package/dist/model/color/Color.js +1 -1
  26. package/dist/model/color/ColorIdentification.js +5 -5
  27. package/dist/model/color/ColorOptions.d.ts.map +1 -1
  28. package/dist/processors/CodeQLProcessor.js +1 -1
  29. package/dist/processors/CommonProcessor.js +1 -1
  30. package/dist/processors/ProcessorFactory.js +1 -1
  31. package/dist/processors/SnykProcessor.js +2 -1
  32. package/dist/representations/CompactGroupByRepresentation.js +1 -1
  33. package/dist/representations/CompactGroupByRunPerLevelRepresentation.js +1 -1
  34. package/dist/representations/CompactGroupByRunPerSeverityRepresentation.js +1 -1
  35. package/dist/representations/CompactGroupByRunRepresentation.js +1 -1
  36. package/dist/representations/CompactGroupBySarifPerLevelRepresentation.js +1 -1
  37. package/dist/representations/CompactGroupBySarifPerSeverityRepresentation.js +1 -1
  38. package/dist/representations/CompactGroupBySarifRepresentation.js +1 -1
  39. package/dist/representations/CompactGroupByToolNamePerLevelRepresentation.js +1 -1
  40. package/dist/representations/CompactGroupByToolNamePerSeverityRepresentation.js +1 -1
  41. package/dist/representations/CompactGroupByToolNameRepresentation.js +1 -1
  42. package/dist/representations/CompactTotalPerLevelRepresentation.js +1 -1
  43. package/dist/representations/CompactTotalPerSeverityRepresentation.js +1 -1
  44. package/dist/representations/CompactTotalRepresentation.js +1 -1
  45. package/dist/representations/Representation.js +1 -1
  46. package/dist/representations/RepresentationFactory.js +1 -1
  47. package/dist/representations/TableGroupByRunPerLevelRepresentation.d.ts.map +1 -1
  48. package/dist/representations/TableGroupByRunPerLevelRepresentation.js +1 -1
  49. package/dist/representations/TableGroupByRunPerSeverityRepresentation.d.ts.map +1 -1
  50. package/dist/representations/TableGroupByRunPerSeverityRepresentation.js +1 -1
  51. package/dist/representations/TableGroupByRunRepresentation.d.ts.map +1 -1
  52. package/dist/representations/TableGroupByRunRepresentation.js +1 -1
  53. package/dist/representations/TableGroupBySarifPerLevelRepresentation.d.ts.map +1 -1
  54. package/dist/representations/TableGroupBySarifPerLevelRepresentation.js +1 -1
  55. package/dist/representations/TableGroupBySarifPerSeverityRepresentation.d.ts.map +1 -1
  56. package/dist/representations/TableGroupBySarifPerSeverityRepresentation.js +1 -1
  57. package/dist/representations/TableGroupBySarifRepresentation.d.ts.map +1 -1
  58. package/dist/representations/TableGroupBySarifRepresentation.js +1 -1
  59. package/dist/representations/TableGroupByToolNamePerLevelRepresentation.d.ts.map +1 -1
  60. package/dist/representations/TableGroupByToolNamePerLevelRepresentation.js +1 -1
  61. package/dist/representations/TableGroupByToolNamePerSeverityRepresentation.d.ts.map +1 -1
  62. package/dist/representations/TableGroupByToolNamePerSeverityRepresentation.js +1 -1
  63. package/dist/representations/TableGroupByToolNameRepresentation.d.ts.map +1 -1
  64. package/dist/representations/TableGroupByToolNameRepresentation.js +1 -1
  65. package/dist/representations/TableGroupRepresentation.d.ts +0 -1
  66. package/dist/representations/TableGroupRepresentation.d.ts.map +1 -1
  67. package/dist/representations/TableGroupRepresentation.js +3 -3
  68. package/dist/representations/table/Cell.d.ts.map +1 -1
  69. package/dist/representations/table/Cell.js +1 -1
  70. package/dist/representations/table/Column.d.ts +0 -1
  71. package/dist/representations/table/Column.d.ts.map +1 -1
  72. package/dist/representations/table/Column.js +4 -3
  73. package/dist/representations/table/Row.d.ts +0 -1
  74. package/dist/representations/table/Row.d.ts.map +1 -1
  75. package/dist/representations/table/Row.js +3 -3
  76. package/dist/representations/table/Table.d.ts.map +1 -1
  77. package/dist/representations/table/Table.js +1 -1
  78. package/dist/system.js +5 -5
  79. package/dist/tsdoc-metadata.json +1 -1
  80. package/dist/types.d.ts +29 -1
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js +11 -1
  83. package/dist/utils/Comparators.js +1 -1
  84. package/dist/utils/ExtendedArray.js +1 -1
  85. package/dist/utils/FileUtils.js +2 -2
  86. package/dist/utils/SarifUtils.js +1 -1
  87. package/dist/utils/StringUtils.js +1 -1
  88. package/etc/sarif-to-slack.api.md +21 -1
  89. package/jest.config.json +4 -4
  90. package/package.json +10 -9
  91. package/src/Logger.ts +50 -34
  92. package/src/SarifToSlackClient.ts +73 -68
  93. package/src/globalState.ts +11 -0
  94. package/src/index.ts +23 -12
  95. package/src/model/Finding.ts +36 -35
  96. package/src/model/FindingArray.ts +5 -5
  97. package/src/model/SendIf.ts +25 -25
  98. package/src/model/SlackMessage.ts +49 -49
  99. package/src/model/color/Color.ts +7 -7
  100. package/src/model/color/ColorIdentification.ts +77 -77
  101. package/src/model/color/ColorOptions.ts +1 -1
  102. package/src/processors/CodeQLProcessor.ts +3 -3
  103. package/src/processors/CommonProcessor.ts +24 -24
  104. package/src/processors/ProcessorFactory.ts +9 -9
  105. package/src/processors/SnykProcessor.ts +3 -2
  106. package/src/representations/CompactGroupByRepresentation.ts +20 -20
  107. package/src/representations/CompactGroupByRunPerLevelRepresentation.ts +2 -2
  108. package/src/representations/CompactGroupByRunPerSeverityRepresentation.ts +2 -2
  109. package/src/representations/CompactGroupByRunRepresentation.ts +10 -10
  110. package/src/representations/CompactGroupBySarifPerLevelRepresentation.ts +2 -2
  111. package/src/representations/CompactGroupBySarifPerSeverityRepresentation.ts +2 -2
  112. package/src/representations/CompactGroupBySarifRepresentation.ts +11 -11
  113. package/src/representations/CompactGroupByToolNamePerLevelRepresentation.ts +2 -2
  114. package/src/representations/CompactGroupByToolNamePerSeverityRepresentation.ts +2 -2
  115. package/src/representations/CompactGroupByToolNameRepresentation.ts +10 -10
  116. package/src/representations/CompactTotalPerLevelRepresentation.ts +2 -2
  117. package/src/representations/CompactTotalPerSeverityRepresentation.ts +2 -2
  118. package/src/representations/CompactTotalRepresentation.ts +5 -5
  119. package/src/representations/Representation.ts +8 -8
  120. package/src/representations/RepresentationFactory.ts +32 -32
  121. package/src/representations/TableGroupByRunPerLevelRepresentation.ts +3 -3
  122. package/src/representations/TableGroupByRunPerSeverityRepresentation.ts +3 -3
  123. package/src/representations/TableGroupByRunRepresentation.ts +5 -5
  124. package/src/representations/TableGroupBySarifPerLevelRepresentation.ts +3 -3
  125. package/src/representations/TableGroupBySarifPerSeverityRepresentation.ts +3 -3
  126. package/src/representations/TableGroupBySarifRepresentation.ts +9 -9
  127. package/src/representations/TableGroupByToolNamePerLevelRepresentation.ts +3 -3
  128. package/src/representations/TableGroupByToolNamePerSeverityRepresentation.ts +3 -3
  129. package/src/representations/TableGroupByToolNameRepresentation.ts +4 -4
  130. package/src/representations/TableGroupRepresentation.ts +32 -32
  131. package/src/representations/table/Cell.ts +8 -8
  132. package/src/representations/table/Column.ts +13 -13
  133. package/src/representations/table/Row.ts +17 -17
  134. package/src/representations/table/Table.ts +21 -21
  135. package/src/system.ts +5 -5
  136. package/src/types.ts +43 -13
  137. package/src/utils/Comparators.ts +6 -6
  138. package/src/utils/ExtendedArray.ts +1 -1
  139. package/src/utils/FileUtils.ts +3 -3
  140. package/src/utils/SarifUtils.ts +6 -6
  141. package/src/utils/StringUtils.ts +3 -3
  142. package/tests/integration/SendSarifToSlack.spec.ts +73 -67
  143. package/tests/representations/CompactGroupByRunPerLevelRepresentation.spec.ts +121 -0
  144. package/tests/representations/CompactGroupByRunPerSeverityRepresentation.spec.ts +122 -0
  145. package/tests/representations/CompactGroupBySarifPerLevelRepresentation.spec.ts +132 -0
  146. package/tests/representations/CompactGroupBySarifPerSeverityRepresentation.spec.ts +133 -0
  147. package/tsconfig.json +3 -4
  148. package/dist/sarif-to-slack.d.ts +0 -562
package/dist/index.d.ts CHANGED
@@ -61,6 +61,13 @@
61
61
  * },
62
62
  * representation: RepresentationType.CompactGroupByToolNamePerSeverity,
63
63
  * sendIf: SendIf.MediumOrHigher,
64
+ * loggerOptions: {
65
+ * logFunctionName: false,
66
+ * minLevel: 'debug',
67
+ * name: 'my-app',
68
+ * stylePrettyLogs: true,
69
+ * prettyLogTemplate: '[{{logLevelName}}] [{{name}}] {{dateIsoStr}} ',
70
+ * },
64
71
  * });
65
72
  * await client.send();
66
73
  * ```
@@ -69,9 +76,525 @@
69
76
  *
70
77
  * @packageDocumentation
71
78
  */
72
- export { Color } from './model/color/Color';
73
- export { ColorOptions, ColorGroupCommon, ColorGroupByLevel, ColorGroupBySeverity } from './model/color/ColorOptions';
74
- export { SendIf } from './model/SendIf';
75
- export { SarifToSlackClient } from './SarifToSlackClient';
76
- export { FooterOptions, FooterType, IncludeAwareOptions, IncludeAwareWithValueOptions, RepresentationType, SarifFileExtension, SarifOptions, SarifToSlackClientOptions } from './types';
77
- //# sourceMappingURL=index.d.ts.map
79
+
80
+ /**
81
+ * This class represents a color in hex format.
82
+ * @public
83
+ */
84
+ export declare class Color {
85
+ /**
86
+ * A valid string that represents a color in hex format.
87
+ * @public
88
+ */
89
+ readonly color: string;
90
+ private constructor();
91
+ /**
92
+ * Creates an instance of {@link Color} class. Before creating an instance of
93
+ * {@link Color} class, it (if applicable) maps CI status into the hex color,
94
+ * and also validates color parameter to be a valid string that represents a
95
+ * color in hex format.
96
+ * @param color - Can be either undefined, valid color in hex format or GitHub
97
+ * CI status (one of: success, failure, cancelled, skipped).
98
+ * @returns An instance of {@link Color} or undefined if color parameter is falsy.
99
+ * @public
100
+ */
101
+ static from(color: string | undefined): Color | undefined;
102
+ private assertHexColor;
103
+ private mapColor;
104
+ }
105
+
106
+ /**
107
+ * Color schema for the findings with the certain level. Color is used by the
108
+ * level importance, i.e. if at least 1 error finding exists then
109
+ * {@link ColorGroupByLevel#error} color is used, then if at least 1 warning
110
+ * finding exists then {@link ColorGroupByLevel#warning} color is used, etc.
111
+ * @public
112
+ */
113
+ export declare type ColorGroupByLevel = ColorGroupCommon & {
114
+ error?: Color;
115
+ warning?: Color;
116
+ note?: Color;
117
+ };
118
+
119
+ /**
120
+ * Color schema for the findings with the certain severity. Color is used by the
121
+ * severity importance, i.e. if at least 1 critical finding exists then
122
+ * {@link ColorGroupBySeverity#critical} color is used, then if at least 1 high
123
+ * finding exists then {@link ColorGroupBySeverity#high} color is used, etc.
124
+ * @public
125
+ */
126
+ export declare type ColorGroupBySeverity = ColorGroupCommon & {
127
+ critical?: Color;
128
+ high?: Color;
129
+ medium?: Color;
130
+ low?: Color;
131
+ };
132
+
133
+ /**
134
+ * Base type that has common fields for both {@link ColorGroupByLevel} and
135
+ * {@link ColorGroupBySeverity}.
136
+ * @public
137
+ */
138
+ export declare type ColorGroupCommon = {
139
+ none?: Color;
140
+ unknown?: Color;
141
+ };
142
+
143
+ /**
144
+ * Represents configuration of the color scheme. If both {@link ColorOptions#byLevel}
145
+ * and {@link ColorOptions#bySeverity} are defined, then {@link ColorOptions#bySeverity}
146
+ * takes precedence.
147
+ * @public
148
+ */
149
+ export declare type ColorOptions = {
150
+ /**
151
+ * Default color if specific color was not found. It is a fallback option.
152
+ */
153
+ default?: Color;
154
+ /**
155
+ * Color scheme for the findings where certain level is presented.
156
+ */
157
+ byLevel?: ColorGroupByLevel;
158
+ /**
159
+ * Color scheme for the findings where certain severity is presented.
160
+ */
161
+ bySeverity?: ColorGroupBySeverity;
162
+ /**
163
+ * Color when no findings are found.
164
+ */
165
+ empty?: Color;
166
+ };
167
+
168
+ /**
169
+ * Options for the footer of a Slack message. "type" is ignored if "value" is
170
+ * not defined.
171
+ * @public
172
+ */
173
+ export declare type FooterOptions = IncludeAwareWithValueOptions & {
174
+ type?: FooterType;
175
+ };
176
+
177
+ /**
178
+ * Enum representing the type of footer in a Slack message.
179
+ * @public
180
+ */
181
+ export declare enum FooterType {
182
+ /**
183
+ * Represents a plain text footer. Text is not formatted and appears as-is.
184
+ */
185
+ PlainText = "plain_text",
186
+ /**
187
+ * Represents a footer with Markdown formatting. Text can include formatting
188
+ * such as bold, italics, and links.
189
+ */
190
+ Markdown = "mrkdwn"
191
+ }
192
+
193
+ /**
194
+ * Type representing properties that indicate whether to include certain information
195
+ * in the Slack message.
196
+ * @public
197
+ */
198
+ export declare type IncludeAwareOptions = {
199
+ include: boolean;
200
+ };
201
+
202
+ /**
203
+ * Type representing properties that indicate whether to include certain information
204
+ * in the Slack message, along with an optional value.
205
+ * @public
206
+ */
207
+ export declare type IncludeAwareWithValueOptions = IncludeAwareOptions & {
208
+ value?: string;
209
+ };
210
+
211
+ /**
212
+ * It is used to stored logging options in global state
213
+ * @public
214
+ */
215
+ export declare type LoggerOptions = {
216
+ logFunctionName?: boolean;
217
+ logFunctionNameOnPosition?: number;
218
+ minLevel?: LogLevel;
219
+ name?: string;
220
+ stylePrettyLogs?: boolean;
221
+ prettyLogTemplate?: string;
222
+ };
223
+
224
+ /**
225
+ * Log levels for the Logger.
226
+ * @public
227
+ */
228
+ export declare type LogLevel = typeof LogLevelItems[number];
229
+
230
+ /**
231
+ * Valid log levels for the Logger.
232
+ * @public
233
+ */
234
+ export declare const LogLevelItems: readonly ["silly", "trace", "debug", "info", "warning", "error", "fatal"];
235
+
236
+ /**
237
+ * This represents what type of message should be sent. There are various options
238
+ * to show information from SARIF in Slack message.
239
+ * @public
240
+ */
241
+ export declare enum RepresentationType {
242
+ /**
243
+ * Compact information about findings grouped by Run with the level representation.
244
+ * @example
245
+ * ```text
246
+ * [Run 1] Grype
247
+ * Error: 1, Warning: 4
248
+ * [Run 2] Grype
249
+ * Warning: 1, Note: 20
250
+ * ```
251
+ */
252
+ CompactGroupByRunPerLevel = 0,
253
+ /**
254
+ * Compact information about findings grouped by Run with the severity representation.
255
+ * @example
256
+ * ```text
257
+ * [Run 1] Grype
258
+ * Critical: 1, High: 3, Medium: 1
259
+ * [Run 2] Grype
260
+ * Medium: 1, Low: 20
261
+ * ```
262
+ */
263
+ CompactGroupByRunPerSeverity = 1,
264
+ /**
265
+ * Compact information about findings grouped by tool name with the level representation.
266
+ * @example
267
+ * ```text
268
+ * Grype
269
+ * Error: 1, Warning: 5, Note: 20
270
+ * ```
271
+ */
272
+ CompactGroupByToolNamePerLevel = 2,
273
+ /**
274
+ * Compact information about findings grouped by tool name with the severity representation.
275
+ * @example
276
+ * ```text
277
+ * Grype
278
+ * Critical: 1, High: 3, Medium: 2, Low: 20
279
+ * ```
280
+ */
281
+ CompactGroupByToolNamePerSeverity = 3,
282
+ /**
283
+ * Compact information about findings grouped by SARIF file with the level representation.
284
+ * @example
285
+ * ```text
286
+ * grype-results-01.sarif
287
+ * Error: 1, Warning: 2, Note: 1
288
+ * grype-results-02.sarif
289
+ * Warning: 3, Note: 19
290
+ * ```
291
+ */
292
+ CompactGroupBySarifPerLevel = 4,
293
+ /**
294
+ * Compact information about findings grouped by SARIF file with the severity
295
+ * representation.
296
+ * @example
297
+ * ```text
298
+ * grype-results-01.sarif
299
+ * High: 3, Medium: 1, Low: 11
300
+ * grype-results-02.sarif
301
+ * Critical: 1, Medium: 1, Low: 9
302
+ * ```
303
+ */
304
+ CompactGroupBySarifPerSeverity = 5,
305
+ /**
306
+ * Compact information about findings with the level representation.
307
+ * @example
308
+ * ```text
309
+ * Total
310
+ * Error: 1, Warning: 5, Note: 20
311
+ * ```
312
+ */
313
+ CompactTotalPerLevel = 6,
314
+ /**
315
+ * Compact information about findings with the severity representation.
316
+ * @example
317
+ * ```text
318
+ * Total
319
+ * Critical: 1, High: 3, Medium: 2, Low: 20
320
+ * ```
321
+ */
322
+ CompactTotalPerSeverity = 7,
323
+ /**
324
+ * Table information about findings grouped by Run with the level representation.
325
+ * @example
326
+ * ```text
327
+ * | | Unknown | None | Note | Warning | Error | Total |
328
+ * | ----- | ------- | ---- | ---- | ------- | ----- | ----- |
329
+ * | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
330
+ * | 2 | 0 | 0 | 9 | 20 | 10 | 39 |
331
+ * | 3 | 0 | 0 | 1 | 0 | 1 | 2 |
332
+ * | 4 | 0 | 0 | 5 | 5 | 0 | 10 |
333
+ * | ----- | ------- | ---- | ---- | ------- | ----- | ----- |
334
+ * | Total | 0 | 0 | 15 | 26 | 11 | 52 |
335
+ * ```
336
+ */
337
+ TableGroupByRunPerLevel = 8,
338
+ /**
339
+ * Table information about findings grouped by Run with the severity representation.
340
+ * @example
341
+ * ```text
342
+ * | | Unknown | None | Low | Medium | High | Critical | Total |
343
+ * | ----- | ------- | ---- | --- | ------ | ---- | -------- | ----- |
344
+ * | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
345
+ * | 2 | 0 | 0 | 9 | 20 | 10 | 0 | 39 |
346
+ * | 3 | 0 | 0 | 1 | 0 | 1 | 0 | 2 |
347
+ * | 4 | 0 | 0 | 5 | 5 | 0 | 0 | 10 |
348
+ * | ----- | ------- | ---- | --- | ------ | ---- | -------- | ----- |
349
+ * | Total | 0 | 0 | 15 | 26 | 11 | 0 | 52 |
350
+ * ```
351
+ */
352
+ TableGroupByRunPerSeverity = 9,
353
+ /**
354
+ * Table information about findings grouped by tool name with the level representation.
355
+ * @example
356
+ * ```text
357
+ * | | Unknown | None | Note | Warning | Error | Total |
358
+ * | ------ | ------- | ---- | ---- | ------- | ----- | ----- |
359
+ * | CodeQL | 0 | 0 | 0 | 1 | 0 | 1 |
360
+ * | grype | 0 | 0 | 9 | 20 | 10 | 39 |
361
+ * | Trivy | 0 | 0 | 1 | 0 | 1 | 2 |
362
+ * | WizCLI | 0 | 0 | 5 | 5 | 0 | 10 |
363
+ * | ------ | ------- | ---- | ---- | ------- | ----- | ----- |
364
+ * | Total | 0 | 0 | 15 | 26 | 11 | 52 |
365
+ * ```
366
+ */
367
+ TableGroupByToolNamePerLevel = 10,
368
+ /**
369
+ * Table information about findings grouped by tool name with the severity representation.
370
+ * @example
371
+ * ```text
372
+ * | | Unknown | None | Low | Medium | High | Critical | Total |
373
+ * | ------ | ------- | ---- | --- | ------ | ---- | -------- | ----- |
374
+ * | CodeQL | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
375
+ * | grype | 0 | 0 | 9 | 20 | 10 | 0 | 39 |
376
+ * | Trivy | 0 | 0 | 1 | 0 | 1 | 0 | 2 |
377
+ * | WizCLI | 0 | 0 | 5 | 5 | 0 | 0 | 10 |
378
+ * | ------ | ------- | ---- | --- | ------ | ---- | -------- | ----- |
379
+ * | Total | 0 | 0 | 15 | 26 | 11 | 0 | 52 |
380
+ * ```
381
+ */
382
+ TableGroupByToolNamePerSeverity = 11,
383
+ /**
384
+ * Table information about findings grouped by SARIF file with the level representation.
385
+ * @example
386
+ * ```text
387
+ * | | Unknown | None | Note | Warning | Error | Total |
388
+ * | ----- | ------- | ---- | ---- | ------- | ----- | ----- |
389
+ * | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
390
+ * | 2 | 0 | 0 | 9 | 20 | 10 | 39 |
391
+ * | ----- | ------- | ---- | ---- | ------- | ----- | ----- |
392
+ * | Total | 0 | 0 | 9 | 21 | 10 | 40 |
393
+ * ```
394
+ */
395
+ TableGroupBySarifPerLevel = 12,
396
+ /**
397
+ * Table information about findings grouped by SARIF file with the severity representation.
398
+ * @example
399
+ * ```text
400
+ * | | Unknown | None | Low | Medium | High | Critical | Total |
401
+ * | ----- | ------- | ---- | --- | ------ | ---- | -------- | ----- |
402
+ * | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
403
+ * | 2 | 0 | 0 | 9 | 20 | 10 | 0 | 39 |
404
+ * | ----- | ------- | ---- | --- | ------ | ---- | -------- | ----- |
405
+ * | Total | 0 | 0 | 9 | 21 | 10 | 0 | 40 |
406
+ * ```
407
+ */
408
+ TableGroupBySarifPerSeverity = 13
409
+ }
410
+
411
+ /**
412
+ * SARIF file extension.
413
+ * @public
414
+ */
415
+ export declare type SarifFileExtension = typeof SarifFileExtensionItems[number];
416
+
417
+ /**
418
+ * Valid SARIF file extensions.
419
+ * @public
420
+ */
421
+ export declare const SarifFileExtensionItems: readonly ["sarif", "json"];
422
+
423
+ /**
424
+ * Represents options for the provided SARIF file(s), such as path, should files
425
+ * from this path be retrieved recursively or not, and file extension.
426
+ * @public
427
+ */
428
+ export declare type SarifOptions = {
429
+ path: string;
430
+ recursive?: boolean;
431
+ extension?: SarifFileExtension;
432
+ };
433
+
434
+ /**
435
+ * Service to convert SARIF files to Slack messages and send them.
436
+ * @public
437
+ */
438
+ export declare class SarifToSlackClient {
439
+ private _message?;
440
+ private _sarifModel?;
441
+ private _sendIf;
442
+ private constructor();
443
+ private static createRunIdGenerator;
444
+ /**
445
+ * Creates an instance of {@link SarifToSlackClient} class. It already has all
446
+ * properties and fields initialized.
447
+ * @param webhookUrl - Slack webhook URL.
448
+ * @param opts - An instance of {@link SarifToSlackClientOptions} type.
449
+ *
450
+ * @see SarifToSlackClientOptions
451
+ *
452
+ * @public
453
+ */
454
+ static create(webhookUrl: string, opts: SarifToSlackClientOptions): Promise<SarifToSlackClient>;
455
+ private static buildModel;
456
+ /**
457
+ * Sends a Slack message.
458
+ * @returns A promise that resolves when the message has been sent.
459
+ * @throws Error if a Slack message was not prepared for the given SARIF path.
460
+ * @public
461
+ */
462
+ send(): Promise<void>;
463
+ private get shouldSendMessage();
464
+ }
465
+
466
+ /**
467
+ * Options for the SarifToSlackClient.
468
+ * @public
469
+ */
470
+ export declare type SarifToSlackClientOptions = {
471
+ sarif: SarifOptions;
472
+ username?: string;
473
+ iconUrl?: string;
474
+ color?: ColorOptions;
475
+ header?: IncludeAwareWithValueOptions;
476
+ footer?: FooterOptions;
477
+ actor?: IncludeAwareWithValueOptions;
478
+ run?: IncludeAwareOptions;
479
+ representation?: RepresentationType;
480
+ sendIf?: SendIf;
481
+ loggerOptions?: LoggerOptions;
482
+ };
483
+
484
+ /**
485
+ * This enum represents the condition on when message should be sent. If this
486
+ * condition is satisfied then message is sent, otherwise - message is not sent.
487
+ * @public
488
+ */
489
+ export declare enum SendIf {
490
+ /**
491
+ * Send message only if there is at least one finding with "Critical" severity.
492
+ * Since it is the higher possible severity, it is the same as "Critical" or
493
+ * higher.
494
+ */
495
+ SeverityCritical = 0,
496
+ /**
497
+ * Send message only if there is at least one finding with "High" severity.
498
+ */
499
+ SeverityHigh = 1,
500
+ /**
501
+ * Send message only if there is at least one finding with "High" severity or
502
+ * higher, that includes "High" and "Critical".
503
+ */
504
+ SeverityHighOrHigher = 2,
505
+ /**
506
+ * Send message only if there is at least one finding with "Medium" severity.
507
+ */
508
+ SeverityMedium = 3,
509
+ /**
510
+ * Send message only if there is at least one finding with "Medium" severity
511
+ * or higher, that includes "Medium", "High" and "Critical".
512
+ */
513
+ SeverityMediumOrHigher = 4,
514
+ /**
515
+ * Send message only if there is at least one finding with "Low" severity.
516
+ */
517
+ SeverityLow = 5,
518
+ /**
519
+ * Send message only if there is at least one finding with "Low" severity or
520
+ * higher, that includes "Low", "Medium", "High" and "Critical".
521
+ */
522
+ SeverityLowOrHigher = 6,
523
+ /**
524
+ * Send message only if there is at least one finding with "None" severity.
525
+ */
526
+ SeverityNone = 7,
527
+ /**
528
+ * Send message only if there is at least one finding with "None" severity or
529
+ * higher, that includes "None", "Low", "Medium", "High" and "Critical".
530
+ */
531
+ SeverityNoneOrHigher = 8,
532
+ /**
533
+ * Send message only if there is at least one finding with "Unknown" severity.
534
+ */
535
+ SeverityUnknown = 9,
536
+ /**
537
+ * Send message only if there is at least one finding with "Unknown" severity
538
+ * or higher, that includes "Unknown", "None", "Low", "Medium", "High" and "Critical".
539
+ */
540
+ SeverityUnknownOrHigher = 10,
541
+ /**
542
+ * Send message only if there is at least one finding with "Error" level.
543
+ * Since it is the higher possible level, it is the same as "Error" or higher.
544
+ */
545
+ LevelError = 11,
546
+ /**
547
+ * Send message only if there is at least one finding with "Warning" level.
548
+ */
549
+ LevelWarning = 12,
550
+ /**
551
+ * Send message only if there is at least one finding with "Warning" level or
552
+ * higher, that includes "Warning" and "Error".
553
+ */
554
+ LevelWarningOrHigher = 13,
555
+ /**
556
+ * Send message only if there is at least one finding with "Note" level.
557
+ */
558
+ LevelNote = 14,
559
+ /**
560
+ * Send message only if there is at least one finding with "Note" level or
561
+ * higher, that includes "Note", "Warning" and "Error.
562
+ */
563
+ LevelNoteOrHigher = 15,
564
+ /**
565
+ * Send message only if there is at least one finding with "None" level.
566
+ */
567
+ LevelNone = 16,
568
+ /**
569
+ * Send message only if there is at least one finding with "None" level or
570
+ * higher, that includes "None", "Note", "Warning" and "Error.
571
+ */
572
+ LevelNoneOrHigher = 17,
573
+ /**
574
+ * Send message only if there is at least one finding with "Unknown" level.
575
+ */
576
+ LevelUnknown = 18,
577
+ /**
578
+ * Send message only if there is at least one finding with "Unknown" level or
579
+ * higher, that includes "Unknown", "None", "Note", "Warning" and "Error.
580
+ */
581
+ LevelUnknownOrHigher = 19,
582
+ /**
583
+ * Always send a message.
584
+ */
585
+ Always = 20,
586
+ /**
587
+ * Send a message if at least 1 vulnerability is found.
588
+ */
589
+ Some = 21,
590
+ /**
591
+ * Send a message only if no vulnerabilities are found.
592
+ */
593
+ Empty = 22,
594
+ /**
595
+ * Never send a message.
596
+ */
597
+ Never = 23
598
+ }
599
+
600
+ export { }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EACL,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EAC1B,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC9B,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -62,6 +62,13 @@
62
62
  * },
63
63
  * representation: RepresentationType.CompactGroupByToolNamePerSeverity,
64
64
  * sendIf: SendIf.MediumOrHigher,
65
+ * loggerOptions: {
66
+ * logFunctionName: false,
67
+ * minLevel: 'debug',
68
+ * name: 'my-app',
69
+ * stylePrettyLogs: true,
70
+ * prettyLogTemplate: '[{{logLevelName}}] [{{name}}] {{dateIsoStr}} ',
71
+ * },
65
72
  * });
66
73
  * await client.send();
67
74
  * ```
@@ -73,5 +80,5 @@
73
80
  export { Color } from './model/color/Color';
74
81
  export { SendIf } from './model/SendIf';
75
82
  export { SarifToSlackClient } from './SarifToSlackClient';
76
- export { FooterType, RepresentationType } from './types';
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEZBQTBGO0FBRTFGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0VHO0FBQ0gsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBTzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUN6RCxPQUFPLEVBRUwsVUFBVSxFQUdWLGtCQUFrQixFQUluQixNQUFNLFNBQVMsQ0FBQSJ9
83
+ export { FooterType, LogLevelItems, RepresentationType, SarifFileExtensionItems, } from './types';
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEZBQTBGO0FBRTFGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZFRztBQUNILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU81QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQVNMLFVBQVUsRUFDVixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLHVCQUF1QixHQUN4QixNQUFNLFNBQVMsQ0FBQyJ9
@@ -15,7 +15,6 @@ export function createFinding(opts) {
15
15
  * @private
16
16
  */
17
17
  class FindingImpl {
18
- _logger = new Logger('FindingImpl');
19
18
  _runMetadata;
20
19
  _result;
21
20
  _sarifPath;
@@ -36,7 +35,7 @@ class FindingImpl {
36
35
  return createFinding({
37
36
  sarifPath: this._sarifPath,
38
37
  runMetadata: this._runMetadata,
39
- result: this._result
38
+ result: this._result,
40
39
  });
41
40
  }
42
41
  get sarifPath() {
@@ -61,7 +60,9 @@ class FindingImpl {
61
60
  this._levelCache = this._processor.tryFindLevel();
62
61
  }
63
62
  if (this._levelCache === undefined) {
64
- this._logger.debug(`Unknown level of ${this._rule?.id} rule`);
63
+ const logger = new Logger();
64
+ ;
65
+ logger.debug(`Unknown level of ${this._rule?.id} rule`);
65
66
  return SecurityLevel.Unknown;
66
67
  }
67
68
  switch (this._levelCache) {
@@ -73,7 +74,8 @@ class FindingImpl {
73
74
  }
74
75
  get severity() {
75
76
  if (this.cvssScore == null || this.cvssScore < 0 || this.cvssScore > 10) {
76
- this._logger.debug(`Unsupported CVSS score ${this.cvssScore} in ${this._rule?.id} rule`);
77
+ const logger = new Logger();
78
+ logger.debug(`Unsupported CVSS score ${this.cvssScore} in ${this._rule?.id} rule`);
77
79
  return SecuritySeverity.Unknown;
78
80
  }
79
81
  if (this.cvssScore >= 9) {
@@ -91,4 +93,4 @@ class FindingImpl {
91
93
  return SecuritySeverity.None;
92
94
  }
93
95
  }
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmluZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC9GaW5kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3hFLE9BQU8sTUFBTSxNQUFNLFdBQVcsQ0FBQTtBQUU5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUEwQmhFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBb0I7SUFDaEQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVc7SUFDRSxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDcEMsWUFBWSxDQUFVO0lBQ3RCLE9BQU8sQ0FBUztJQUNoQixVQUFVLENBQVM7SUFDbkIsS0FBSyxDQUF1QjtJQUM1QixVQUFVLENBQWtCO0lBRXJDLHdCQUF3QixHQUFZLEtBQUssQ0FBQztJQUMxQyxlQUFlLEdBQXVCLFNBQVMsQ0FBQztJQUVoRCxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEMsV0FBVyxHQUE2QixTQUFTLENBQUM7SUFFMUQsWUFBWSxJQUFvQjtRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDcEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQTtRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcs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
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmluZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC9GaW5kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pFLE9BQU8sTUFBTSxNQUFNLFdBQVcsQ0FBQztBQUUvQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUEwQmpFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBb0I7SUFDaEQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVc7SUFDRSxZQUFZLENBQVU7SUFDdEIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBUztJQUNuQixLQUFLLENBQXVCO0lBQzVCLFVBQVUsQ0FBa0I7SUFFckMsd0JBQXdCLEdBQVksS0FBSyxDQUFDO0lBQzFDLGVBQWUsR0FBdUIsU0FBUyxDQUFDO0lBRWhELG9CQUFvQixHQUFZLEtBQUssQ0FBQztJQUN0QyxXQUFXLEdBQTZCLFNBQVMsQ0FBQztJQUUxRCxZQUFZLElBQW9CO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPLGFBQWEs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
@@ -21,4 +21,4 @@ export default class FindingArray extends ExtendedArray {
21
21
  .some((v) => this.findByProperty('level', v) != null);
22
22
  }
23
23
  }
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmluZGluZ0FycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL0ZpbmRpbmdBcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzFELE9BQU8sYUFBYSxNQUFNLHdCQUF3QixDQUFBO0FBRWxEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLFlBQWEsU0FBUSxhQUFzQjtJQUV2RCxtQkFBbUIsQ0FBQyxRQUEwQjtRQUNuRCxPQUFPLE1BQU07YUFDVixNQUFNLENBQUMsZ0JBQWdCLENBQUM7YUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBNEIsRUFBeUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQzthQUN0RixNQUFNLENBQUMsQ0FBQyxDQUFtQixFQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDO2FBQ3ZELElBQUksQ0FBQyxDQUFDLENBQW1CLEVBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUMxQyxPQUFPLE1BQU07YUFDVixNQUFNLENBQUMsYUFBYSxDQUFDO2FBQ3JCLE1BQU0sQ0FBQyxDQUFDLENBQXlCLEVBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUM7YUFDaEYsTUFBTSxDQUFDLENBQUMsQ0FBZ0IsRUFBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQzthQUNqRCxJQUFJLENBQUMsQ0FBQyxDQUFnQixFQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQTtJQUNqRixDQUFDO0NBQ0YifQ==
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmluZGluZ0FycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL0ZpbmRpbmdBcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNELE9BQU8sYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBRW5EOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLFlBQWEsU0FBUSxhQUFzQjtJQUV2RCxtQkFBbUIsQ0FBQyxRQUEwQjtRQUNuRCxPQUFPLE1BQU07YUFDVixNQUFNLENBQUMsZ0JBQWdCLENBQUM7YUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBNEIsRUFBeUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQzthQUN0RixNQUFNLENBQUMsQ0FBQyxDQUFtQixFQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDO2FBQ3ZELElBQUksQ0FBQyxDQUFDLENBQW1CLEVBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUMxQyxPQUFPLE1BQU07YUFDVixNQUFNLENBQUMsYUFBYSxDQUFDO2FBQ3JCLE1BQU0sQ0FBQyxDQUFDLENBQXlCLEVBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUM7YUFDaEYsTUFBTSxDQUFDLENBQUMsQ0FBZ0IsRUFBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQzthQUNqRCxJQUFJLENBQUMsQ0FBQyxDQUFnQixFQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUNsRixDQUFDO0NBQ0YifQ==
@@ -173,4 +173,4 @@ export function sendIfLogMessage(sendIf) {
173
173
  return 'Unknown SendIf value.';
174
174
  }
175
175
  }
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VuZElmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL1NlbmRJZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFOLElBQVksTUE2R1g7QUE3R0QsV0FBWSxNQUFNO0lBQ2hCOzs7O09BSUc7SUFDSCwyREFBZ0IsQ0FBQTtJQUNoQjs7T0FFRztJQUNILG1EQUFZLENBQUE7SUFDWjs7O09BR0c7SUFDSCxtRUFBb0IsQ0FBQTtJQUNwQjs7T0FFRztJQUNILHVEQUFjLENBQUE7SUFDZDs7O09BR0c7SUFDSCx1RUFBc0IsQ0FBQTtJQUN0Qjs7T0FFRztJQUNILGlEQUFXLENBQUE7SUFDWDs7O09BR0c7SUFDSCxpRUFBbUIsQ0FBQTtJQUNuQjs7T0FFRztJQUNILG1EQUFZLENBQUE7SUFDWjs7O09BR0c7SUFDSCxtRUFBb0IsQ0FBQTtJQUNwQjs7T0FFRztJQUNILHlEQUFlLENBQUE7SUFDZjs7O09BR0c7SUFDSCwwRUFBdUIsQ0FBQTtJQUN2Qjs7O09BR0c7SUFDSCxnREFBVSxDQUFBO0lBQ1Y7O09BRUc7SUFDSCxvREFBWSxDQUFBO0lBQ1o7OztPQUdHO0lBQ0gsb0VBQW9CLENBQUE7SUFDcEI7O09BRUc7SUFDSCw4Q0FBUyxDQUFBO0lBQ1Q7OztPQUdHO0lBQ0gsOERBQWlCLENBQUE7SUFDakI7O09BRUc7SUFDSCw4Q0FBUyxDQUFBO0lBQ1Q7OztPQUdHO0lBQ0gsOERBQWlCLENBQUE7SUFDakI7O09BRUc7SUFDSCxvREFBWSxDQUFBO0lBQ1o7OztPQUdHO0lBQ0gsb0VBQW9CLENBQUE7SUFDcEI7O09BRUc7SUFDSCx3Q0FBTSxDQUFBO0lBQ047O09BRUc7SUFDSCxvQ0FBSSxDQUFBO0lBQ0o7O09BRUc7SUFDSCxzQ0FBSyxDQUFBO0lBQ0w7O09BRUc7SUFDSCxzQ0FBSyxDQUFBO0FBQ1AsQ0FBQyxFQTdHVyxNQUFNLEtBQU4sTUFBTSxRQTZHakI7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQWM7SUFDN0MsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssTUFBTSxDQUFDLGdCQUFnQjtZQUMxQixPQUFPLHdEQUF3RCxDQUFBO1FBQ2pFLEtBQUssTUFBTSxDQUFDLFlBQVk7WUFDdEIsT0FBTyxvREFBb0QsQ0FBQTtRQUM3RCxLQUFLLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUIsT0FBTyw4REFBOEQsQ0FBQTtRQUN2RSxLQUFLLE1BQU0sQ0FBQyxjQUFjO1lBQ3hCLE9BQU8sc0RBQXNELENBQUE7UUFDL0QsS0FBSyxNQUFNLENBQUMsc0JBQXNCO1lBQ2hDLE9BQU8sZ0VBQWdFLENBQUE7UUFDekUsS0FBSyxNQUFNLENBQUMsV0FBVztZQUNyQixPQUFPLG1EQUFtRCxDQUFBO1FBQzVELEtBQUssTUFBTSxDQUFDLG1CQUFtQjtZQUM3QixPQUFPLDZEQUE2RCxDQUFBO1FBQ3RFLEtBQUssTUFBTSxDQUFDLFlBQVk7WUFDdEIsT0FBTyxvREFBb0QsQ0FBQTtRQUM3RCxLQUFLLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUIsT0FBTyw4REFBOEQsQ0FBQTtRQUN2RSxLQUFLLE1BQU0sQ0FBQyxlQUFlO1lBQ3pCLE9BQU8sdURBQXVELENBQUE7UUFDaEUsS0FBSyxNQUFNLENBQUMsdUJBQXVCO1lBQ2pDLE9BQU8saUVBQWlFLENBQUE7UUFDMUUsS0FBSyxNQUFNLENBQUMsVUFBVTtZQUNwQixPQUFPLGtEQUFrRCxDQUFBO1FBQzNELEtBQUssTUFBTSxDQUFDLFlBQVk7WUFDdEIsT0FBTyxvREFBb0QsQ0FBQTtRQUM3RCxLQUFLLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUIsT0FBTyw4REFBOEQsQ0FBQTtRQUN2RSxLQUFLLE1BQU0sQ0FBQyxTQUFTO1lBQ25CLE9BQU8saURBQWlELENBQUE7UUFDMUQsS0FBSyxNQUFNLENBQUMsaUJBQWlCO1lBQzNCLE9BQU8sMkRBQTJELENBQUE7UUFDcEUsS0FBSyxNQUFNLENBQUMsU0FBUztZQUNuQixPQUFPLGlEQUFpRCxDQUFBO1FBQzFELEtBQUssTUFBTSxDQUFDLGlCQUFpQjtZQUMzQixPQUFPLDJEQUEyRCxDQUFBO1FBQ3BFLEtBQUssTUFBTSxDQUFDLFlBQVk7WUFDdEIsT0FBTyxvREFBb0QsQ0FBQTtRQUM3RCxLQUFLLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUIsT0FBTyw4REFBOEQsQ0FBQTtRQUN2RSxLQUFLLE1BQU0sQ0FBQyxNQUFNO1lBQ2hCLE9BQU8sc0JBQXNCLENBQUE7UUFDL0IsS0FBSyxNQUFNLENBQUMsSUFBSTtZQUNkLE9BQU8sMENBQTBDLENBQUE7UUFDbkQsS0FBSyxNQUFNLENBQUMsS0FBSztZQUNmLE9BQU8sMkNBQTJDLENBQUE7UUFDcEQsS0FBSyxNQUFNLENBQUMsS0FBSztZQUNmLE9BQU8sdUNBQXVDLENBQUE7UUFDaEQ7WUFDRSxPQUFPLHVCQUF1QixDQUFBO0lBQ2xDLENBQUM7QUFDSCxDQUFDIn0=
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VuZElmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL1NlbmRJZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFOLElBQVksTUE2R1g7QUE3R0QsV0FBWSxNQUFNO0lBQ2hCOzs7O09BSUc7SUFDSCwyREFBZ0IsQ0FBQTtJQUNoQjs7T0FFRztJQUNILG1EQUFZLENBQUE7SUFDWjs7O09BR0c7SUFDSCxtRUFBb0IsQ0FBQTtJQUNwQjs7T0FFRztJQUNILHVEQUFjLENBQUE7SUFDZDs7O09BR0c7SUFDSCx1RUFBc0IsQ0FBQTtJQUN0Qjs7T0FFRztJQUNILGlEQUFXLENBQUE7SUFDWDs7O09BR0c7SUFDSCxpRUFBbUIsQ0FBQTtJQUNuQjs7T0FFRztJQUNILG1EQUFZLENBQUE7SUFDWjs7O09BR0c7SUFDSCxtRUFBb0IsQ0FBQTtJQUNwQjs7T0FFRztJQUNILHlEQUFlLENBQUE7SUFDZjs7O09BR0c7SUFDSCwwRUFBdUIsQ0FBQTtJQUN2Qjs7O09BR0c7SUFDSCxnREFBVSxDQUFBO0lBQ1Y7O09BRUc7SUFDSCxvREFBWSxDQUFBO0lBQ1o7OztPQUdHO0lBQ0gsb0VBQW9CLENBQUE7SUFDcEI7O09BRUc7SUFDSCw4Q0FBUyxDQUFBO0lBQ1Q7OztPQUdHO0lBQ0gsOERBQWlCLENBQUE7SUFDakI7O09BRUc7SUFDSCw4Q0FBUyxDQUFBO0lBQ1Q7OztPQUdHO0lBQ0gsOERBQWlCLENBQUE7SUFDakI7O09BRUc7SUFDSCxvREFBWSxDQUFBO0lBQ1o7OztPQUdHO0lBQ0gsb0VBQW9CLENBQUE7SUFDcEI7O09BRUc7SUFDSCx3Q0FBTSxDQUFBO0lBQ047O09BRUc7SUFDSCxvQ0FBSSxDQUFBO0lBQ0o7O09BRUc7SUFDSCxzQ0FBSyxDQUFBO0lBQ0w7O09BRUc7SUFDSCxzQ0FBSyxDQUFBO0FBQ1AsQ0FBQyxFQTdHVyxNQUFNLEtBQU4sTUFBTSxRQTZHakI7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQWM7SUFDN0MsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssTUFBTSxDQUFDLGdCQUFnQjtZQUMxQixPQUFPLHdEQUF3RCxDQUFDO1FBQ2xFLEtBQUssTUFBTSxDQUFDLFlBQVk7WUFDdEIsT0FBTyxvREFBb0QsQ0FBQztRQUM5RCxLQUFLLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUIsT0FBTyw4REFBOEQsQ0FBQztRQUN4RSxLQUFLLE1BQU0sQ0FBQyxjQUFjO1lBQ3hCLE9BQU8sc0RBQXNELENBQUM7UUFDaEUsS0FBSyxNQUFNLENBQUMsc0JBQXNCO1lBQ2hDLE9BQU8sZ0VBQWdFLENBQUM7UUFDMUUsS0FBSyxNQUFNLENBQUMsV0FBVztZQUNyQixPQUFPLG1EQUFtRCxDQUFDO1FBQzdELEtBQUssTUFBTSxDQUFDLG1CQUFtQjtZQUM3QixPQUFPLDZEQUE2RCxDQUFDO1FBQ3ZFLEtBQUssTUFBTSxDQUFDLFlBQVk7WUFDdEIsT0FBTyxvREFBb0QsQ0FBQztRQUM5RCxLQUFLLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUIsT0FBTyw4REFBOEQsQ0FBQztRQUN4RSxLQUFLLE1BQU0sQ0FBQyxlQUFlO1lBQ3pCLE9BQU8sdURBQXVELENBQUM7UUFDakUsS0FBSyxNQUFNLENBQUMsdUJBQXVCO1lBQ2pDLE9BQU8saUVBQWlFLENBQUM7UUFDM0UsS0FBSyxNQUFNLENBQUMsVUFBVTtZQUNwQixPQUFPLGtEQUFrRCxDQUFDO1FBQzVELEtBQUssTUFBTSxDQUFDLFlBQVk7WUFDdEIsT0FBTyxvREFBb0QsQ0FBQztRQUM5RCxLQUFLLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUIsT0FBTyw4REFBOEQsQ0FBQztRQUN4RSxLQUFLLE1BQU0sQ0FBQyxTQUFTO1lBQ25CLE9BQU8saURBQWlELENBQUM7UUFDM0QsS0FBSyxNQUFNLENBQUMsaUJBQWlCO1lBQzNCLE9BQU8sMkRBQTJELENBQUM7UUFDckUsS0FBSyxNQUFNLENBQUMsU0FBUztZQUNuQixPQUFPLGlEQUFpRCxDQUFDO1FBQzNELEtBQUssTUFBTSxDQUFDLGlCQUFpQjtZQUMzQixPQUFPLDJEQUEyRCxDQUFDO1FBQ3JFLEtBQUssTUFBTSxDQUFDLFlBQVk7WUFDdEIsT0FBTyxvREFBb0QsQ0FBQztRQUM5RCxLQUFLLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUIsT0FBTyw4REFBOEQsQ0FBQztRQUN4RSxLQUFLLE1BQU0sQ0FBQyxNQUFNO1lBQ2hCLE9BQU8sc0JBQXNCLENBQUM7UUFDaEMsS0FBSyxNQUFNLENBQUMsSUFBSTtZQUNkLE9BQU8sMENBQTBDLENBQUM7UUFDcEQsS0FBSyxNQUFNLENBQUMsS0FBSztZQUNmLE9BQU8sMkNBQTJDLENBQUM7UUFDckQsS0FBSyxNQUFNLENBQUMsS0FBSztZQUNmLE9BQU8sdUNBQXVDLENBQUM7UUFDakQ7WUFDRSxPQUFPLHVCQUF1QixDQUFDO0lBQ25DLENBQUM7QUFDSCxDQUFDIn0=