@fabasoad/sarif-to-slack 0.1.1 → 0.2.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.
Files changed (99) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/.github/pull_request_template.md +3 -3
  3. package/.github/workflows/linting.yml +14 -0
  4. package/.github/workflows/release.yml +5 -1
  5. package/.github/workflows/send-sarif-to-slack.yml +214 -0
  6. package/.github/workflows/unit-tests.yml +1 -0
  7. package/.pre-commit-config.yaml +3 -3
  8. package/.tool-versions +1 -1
  9. package/CONTRIBUTING.md +1 -1
  10. package/Makefile +10 -3
  11. package/README.md +36 -5
  12. package/biome.json +15 -12
  13. package/dist/Logger.js +17 -6
  14. package/dist/Processors.js +23 -22
  15. package/dist/SarifToSlackService.d.ts.map +1 -1
  16. package/dist/SarifToSlackService.js +6 -7
  17. package/dist/SlackMessageBuilder.js +51 -55
  18. package/dist/index.d.ts +9 -4
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +10 -5
  21. package/dist/model/SarifModelPerRun.d.ts +17 -0
  22. package/dist/model/SarifModelPerRun.d.ts.map +1 -0
  23. package/dist/model/SarifModelPerRun.js +84 -0
  24. package/dist/model/SarifModelPerSarif.d.ts +20 -0
  25. package/dist/model/SarifModelPerSarif.d.ts.map +1 -0
  26. package/dist/model/SarifModelPerSarif.js +97 -0
  27. package/dist/model/types.d.ts +17 -0
  28. package/dist/model/types.d.ts.map +1 -0
  29. package/dist/model/types.js +31 -0
  30. package/dist/sarif-to-slack.d.ts +121 -18
  31. package/dist/tsdoc-metadata.json +1 -1
  32. package/dist/types.d.ts +107 -15
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/types.js +73 -7
  35. package/dist/utils/SarifUtils.d.ts +5 -0
  36. package/dist/utils/SarifUtils.d.ts.map +1 -0
  37. package/dist/utils/SarifUtils.js +32 -0
  38. package/dist/utils/SortUtils.d.ts +5 -0
  39. package/dist/utils/SortUtils.d.ts.map +1 -0
  40. package/dist/utils/SortUtils.js +8 -0
  41. package/dist/version.d.ts +2 -0
  42. package/dist/version.d.ts.map +1 -0
  43. package/dist/version.js +4 -0
  44. package/etc/sarif-to-slack.api.md +47 -9
  45. package/jest.config.json +4 -4
  46. package/package.json +14 -10
  47. package/scripts/save-version.sh +6 -0
  48. package/src/Logger.ts +22 -17
  49. package/src/Processors.ts +22 -22
  50. package/src/SarifToSlackService.ts +6 -7
  51. package/src/SlackMessageBuilder.ts +85 -68
  52. package/src/index.ts +17 -6
  53. package/src/model/SarifModelPerRun.ts +114 -0
  54. package/src/model/SarifModelPerSarif.ts +116 -0
  55. package/src/model/types.ts +31 -0
  56. package/src/types.ts +113 -15
  57. package/src/utils/SarifUtils.ts +44 -0
  58. package/src/utils/SortUtils.ts +21 -0
  59. package/src/version.ts +3 -0
  60. package/test-data/sarif/codeql-csharp.sarif +1 -0
  61. package/test-data/sarif/codeql-go.sarif +1 -0
  62. package/test-data/sarif/codeql-python.sarif +1 -0
  63. package/test-data/sarif/codeql-ruby.sarif +1 -0
  64. package/test-data/sarif/codeql-typescript.sarif +1 -0
  65. package/test-data/sarif/grype-container.sarif +1774 -0
  66. package/test-data/sarif/runs-1-tools-1-results-0.sarif +18 -0
  67. package/test-data/sarif/runs-2-tools-1-results-0.sarif +30 -0
  68. package/test-data/sarif/runs-2-tools-1.sarif +656 -0
  69. package/test-data/sarif/runs-2-tools-2-results-0.sarif +44 -0
  70. package/test-data/sarif/runs-2-tools-2.sarif +686 -0
  71. package/test-data/sarif/runs-3-tools-2-results-0.sarif +48 -0
  72. package/test-data/sarif/runs-3-tools-2.sarif +278 -0
  73. package/test-data/sarif/snyk-composer.sarif +934 -0
  74. package/test-data/sarif/snyk-container.sarif +313 -0
  75. package/test-data/sarif/snyk-gomodules.sarif +388 -0
  76. package/test-data/sarif/snyk-gradle.sarif +274 -0
  77. package/test-data/sarif/snyk-hex.sarif +66 -0
  78. package/test-data/sarif/snyk-maven.sarif +274 -0
  79. package/test-data/sarif/snyk-npm.sarif +896 -0
  80. package/test-data/sarif/snyk-nuget.sarif +90 -0
  81. package/test-data/sarif/snyk-pip.sarif +66 -0
  82. package/test-data/sarif/snyk-pnpm.sarif +90 -0
  83. package/test-data/sarif/snyk-poetry.sarif +1952 -0
  84. package/test-data/sarif/snyk-rubygems.sarif +440 -0
  85. package/test-data/sarif/snyk-sbt.sarif +178 -0
  86. package/test-data/sarif/snyk-swift.sarif +112 -0
  87. package/test-data/sarif/snyk-yarn.sarif +2900 -0
  88. package/test-data/sarif/trivy-iac.sarif +134 -0
  89. package/test-data/sarif/wiz-container.sarif +30916 -0
  90. package/test-data/sarif/wiz-iac.sarif +558 -0
  91. package/tests/Processors.spec.ts +3 -3
  92. package/tests/integration/SendSarifToSlack.spec.ts +56 -0
  93. package/tsconfig.json +14 -14
  94. package/dist/Logger.js.map +0 -1
  95. package/dist/Processors.js.map +0 -1
  96. package/dist/SarifToSlackService.js.map +0 -1
  97. package/dist/SlackMessageBuilder.js.map +0 -1
  98. package/dist/index.js.map +0 -1
  99. package/dist/types.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { promises as fs } from 'fs';
2
2
  import Logger from './Logger';
3
- import { processColor, processLogLevel, processSarifPath } from './Processors';
3
+ import { processColor, processSarifPath } from './Processors';
4
4
  import { SlackMessageBuilder } from './SlackMessageBuilder';
5
5
  async function initialize(opts) {
6
6
  const slackMessages = new Map();
@@ -14,13 +14,14 @@ async function initialize(opts) {
14
14
  username: opts.username,
15
15
  iconUrl: opts.iconUrl,
16
16
  color: processColor(opts.color),
17
- sarif: JSON.parse(jsonString)
17
+ sarif: JSON.parse(jsonString),
18
+ output: opts.output,
18
19
  });
19
20
  if (opts.header?.include) {
20
21
  messageBuilder.withHeader(opts.header?.value);
21
22
  }
22
23
  if (opts.footer?.include) {
23
- messageBuilder.withFooter(opts.footer?.value);
24
+ messageBuilder.withFooter(opts.footer?.value, opts.footer?.type);
24
25
  }
25
26
  if (opts.actor?.include) {
26
27
  messageBuilder.withActor(opts.actor?.value);
@@ -57,9 +58,7 @@ export class SarifToSlackService {
57
58
  * @public
58
59
  */
59
60
  static async create(opts) {
60
- Logger.initialize({
61
- logLevel: processLogLevel(opts.logLevel)
62
- });
61
+ Logger.initialize(opts.log);
63
62
  const instance = new SarifToSlackService();
64
63
  const map = await initialize(opts);
65
64
  map.forEach((val, key) => instance._slackMessages.set(key, val));
@@ -92,4 +91,4 @@ export class SarifToSlackService {
92
91
  Logger.info(`Message sent for ${sarifPath} file. Status:`, text);
93
92
  }
94
93
  }
95
- //# sourceMappingURL=SarifToSlackService.js.map
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2FyaWZUb1NsYWNrU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TYXJpZlRvU2xhY2tTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBTzNELEtBQUssVUFBVSxVQUFVLENBQUMsSUFBZ0M7SUFDeEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQWEsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzdELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtJQUNqRixDQUFDO0lBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFVBQVUsR0FBVyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRS9ELE1BQU0sY0FBYyxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM5RCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEtBQUssRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQWE7WUFDekMsTUFBTSxFQUFFLElB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
@@ -1,4 +1,7 @@
1
1
  import { IncomingWebhook } from '@slack/webhook';
2
+ import { CalculateResultsBy, FooterType, GroupResultsBy } from './types';
3
+ import { LIB_VERSION } from './version';
4
+ import { SarifModelPerSarif } from './model/SarifModelPerSarif';
2
5
  /**
3
6
  * Class for building and sending Slack messages based on SARIF logs.
4
7
  * @internal
@@ -7,6 +10,8 @@ export class SlackMessageBuilder {
7
10
  webhook;
8
11
  gitHubServerUrl;
9
12
  color;
13
+ sarifModelPerSarif;
14
+ output;
10
15
  header;
11
16
  footer;
12
17
  actor;
@@ -17,9 +22,14 @@ export class SlackMessageBuilder {
17
22
  username: opts.username || 'SARIF results',
18
23
  icon_url: opts.iconUrl
19
24
  });
25
+ this.gitHubServerUrl = process.env.GITHUB_SERVER_URL || 'https://github.com';
20
26
  this.color = opts.color;
21
27
  this.sarif = opts.sarif;
22
- this.gitHubServerUrl = process.env.GITHUB_SERVER_URL || 'https://github.com';
28
+ this.sarifModelPerSarif = new SarifModelPerSarif(opts.sarif);
29
+ this.output = opts.output || {
30
+ groupBy: GroupResultsBy.ToolName,
31
+ calculateBy: CalculateResultsBy.Level
32
+ };
23
33
  }
24
34
  withHeader(header) {
25
35
  this.header = {
@@ -36,14 +46,14 @@ export class SlackMessageBuilder {
36
46
  withRun() {
37
47
  this.runId = process.env.GITHUB_RUN_ID;
38
48
  }
39
- withFooter(footer) {
40
- const repoName = 'fabasoad/sarif-to-slack-action';
49
+ withFooter(text, type) {
50
+ const repoName = 'fabasoad/sarif-to-slack';
51
+ const element = text
52
+ ? { type: type || FooterType.PlainText, text }
53
+ : { type: FooterType.Markdown, text: `Generated by <${this.gitHubServerUrl}/${repoName}|@${repoName}@${LIB_VERSION}>` };
41
54
  this.footer = {
42
55
  type: 'context',
43
- elements: [{
44
- type: footer ? 'plain_text' : 'mrkdwn',
45
- text: footer || `Generated by <${this.gitHubServerUrl}/${repoName}|${repoName}>`
46
- }],
56
+ elements: [element],
47
57
  };
48
58
  }
49
59
  async send() {
@@ -83,61 +93,47 @@ export class SlackMessageBuilder {
83
93
  }
84
94
  text.push(runText);
85
95
  }
86
- return text.join('\n');
96
+ return text.join('\n\n');
87
97
  }
88
- composeRunSummary(toolName, map) {
89
- const levelsText = [];
90
- for (const [level, count] of map.entries()) {
91
- const levelCapitalized = level.charAt(0).toUpperCase() + level.slice(1);
92
- levelsText.push(`*${levelCapitalized}*: ${count}`);
98
+ composeSummaryWith(map, resultProcessor = (result) => result) {
99
+ const stats = new Array();
100
+ for (const [key, count] of map.entries()) {
101
+ stats.push(`*${key}*: ${count}`);
93
102
  }
94
- return `*${toolName}*\n${levelsText.join(', ')}`;
103
+ return resultProcessor(stats.length == 0 ? 'No issues found' : stats.join(', '));
95
104
  }
96
105
  composeSummary() {
97
- const data = new Map();
98
- for (const run of this.sarif.runs) {
99
- const toolName = run.tool.driver.name;
100
- if (!data.has(toolName)) {
101
- data.set(toolName, new Map());
106
+ const summaries = new Array();
107
+ switch (this.output.groupBy) {
108
+ case GroupResultsBy.ToolName: {
109
+ const dataGroupedByToolName = this.output.calculateBy === CalculateResultsBy.Level
110
+ ? this.sarifModelPerSarif.groupByToolNameWithSecurityLevel()
111
+ : this.sarifModelPerSarif.groupByToolNameWithSecuritySeverity();
112
+ for (const [toolName, map] of dataGroupedByToolName.entries()) {
113
+ summaries.push(this.composeSummaryWith(map, (result) => `*${toolName}*\n${result}`));
114
+ }
115
+ break;
102
116
  }
103
- const results = run.results ?? [];
104
- for (const result of results) {
105
- const level = this.tryGetLevel(run, result);
106
- const count = data.get(toolName)?.get(level) || 0;
107
- data.get(toolName)?.set(level, count + 1);
117
+ case GroupResultsBy.Run: {
118
+ const dataGroupedByRun = this.output.calculateBy === CalculateResultsBy.Level
119
+ ? this.sarifModelPerSarif.groupByRunWithSecurityLevel()
120
+ : this.sarifModelPerSarif.groupByRunWithSecuritySeverity();
121
+ for (let i = 0; i < dataGroupedByRun.length; i++) {
122
+ const { data, toolName } = dataGroupedByRun[i];
123
+ summaries.push(this.composeSummaryWith(data, (result) => `_[Run ${i + 1}]_: *${toolName}*\n${result}`));
124
+ }
125
+ break;
108
126
  }
109
- }
110
- const summaries = [];
111
- for (const [toolName, map] of data.entries()) {
112
- summaries.push(this.composeRunSummary(toolName, map));
113
- }
114
- return summaries.join('\n');
115
- }
116
- tryGetLevel(run, result) {
117
- if (result.level) {
118
- return result.level;
119
- }
120
- const ruleData = {};
121
- if (result.rule) {
122
- if (result.rule?.index) {
123
- ruleData.index = result.rule.index;
124
- }
125
- if (result.rule?.id) {
126
- ruleData.id = result.rule.id;
127
- }
128
- }
129
- if (!ruleData.index && result.ruleIndex) {
130
- ruleData.index = result.ruleIndex;
131
- }
132
- if (ruleData.index
133
- && run.tool.driver?.rules
134
- && ruleData.index < run.tool.driver.rules.length) {
135
- const rule = run.tool.driver.rules[ruleData.index];
136
- if (rule.properties && 'problem.severity' in rule.properties) {
137
- return rule.properties['problem.severity'];
127
+ default: {
128
+ const dataTotal = this.output.calculateBy === CalculateResultsBy.Level
129
+ ? this.sarifModelPerSarif.groupByTotalWithSecurityLevel()
130
+ : this.sarifModelPerSarif.groupByTotalWithSecuritySeverity();
131
+ const toolNames = this.sarifModelPerSarif.listToolNames();
132
+ summaries.push(this.composeSummaryWith(dataTotal, (result) => `*${Array.from(toolNames).join('*, *')}*\n${result}`));
133
+ break;
138
134
  }
139
135
  }
140
- return 'unknown';
136
+ return summaries.join('\n\n');
141
137
  }
142
138
  }
143
- //# sourceMappingURL=SlackMessageBuilder.js.map
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xhY2tNZXNzYWdlQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TbGFja01lc3NhZ2VCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVoRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixjQUFjLEVBSWYsTUFBTSxTQUFTLENBQUE7QUFDaEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN2QyxPQUFPLEVBRUwsa0JBQWtCLEVBQ25CLE1BQU0sNEJBQTRCLENBQUM7QUFlcEM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQUNiLE9BQU8sQ0FBaUI7SUFDeEIsZUFBZSxDQUFRO0lBQ3ZCLEtBQUssQ0FBUztJQUNkLGtCQUFrQixDQUFvQjtJQUN0QyxNQUFNLENBQW9CO0lBQ25DLE1BQU0sQ0FBYztJQUVwQixNQUFNLENBQWU7SUFDckIsS0FBSyxDQUFTO0lBQ2QsS0FBSyxDQUFTO0lBRU4sS0FBSyxDQUFVO0lBRS9CLFlBQVksR0FBVyxFQUFFLElBQWdDO1FBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsR0FBRyxFQUFFO1lBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLGVBQWU7WUFDMUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3ZCLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxvQkFBb0IsQ0FBQTtRQUM1RSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxL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
package/dist/index.d.ts CHANGED
@@ -7,12 +7,16 @@
7
7
  *
8
8
  * @example
9
9
  * ```typescript
10
- * import { SarifToSlackService } from 'sarif-to-slack';
10
+ * import { SarifToSlackService, FooterType } from '@fabasoad/sarif-to-slack';
11
11
  *
12
- * const service = new SarifToSlackService({
12
+ * const service = await SarifToSlackService.create({
13
13
  * webhookUrl: 'https://hooks.slack.com/services/your/webhook/url',
14
14
  * sarifPath: 'path/to/your/sarif/file.sarif',
15
- * logLevel: 'info',
15
+ * log: {
16
+ * level: 'info',
17
+ * template: '[{{logLevelName}}] [{{name}}] {{dateIsoStr}} ',
18
+ * colored: false,
19
+ * },
16
20
  * username: 'SARIF Bot',
17
21
  * iconUrl: 'https://example.com/icon.png',
18
22
  * color: '#36a64f',
@@ -22,6 +26,7 @@
22
26
  * },
23
27
  * footer: {
24
28
  * include: true,
29
+ * type: FooterType.PLAIN_TEXT,
25
30
  * value: 'Generated by @fabasoad/sarif-to-slack'
26
31
  * },
27
32
  * actor: {
@@ -40,5 +45,5 @@
40
45
  * @packageDocumentation
41
46
  */
42
47
  export { SarifToSlackService } from './SarifToSlackService';
43
- export { IncludeAwareProps, IncludeAwareWithValueProps, LogLevel, Sarif, SarifToSlackServiceOptions, SlackMessage, } from './types';
48
+ export { CalculateResultsBy, FooterOptions, FooterType, GroupResultsBy, IncludeAwareOptions, IncludeAwareWithValueOptions, LogLevel, LogOptions, SarifLog, SarifToSlackOutput, SarifToSlackServiceOptions, SlackMessage, } from './types';
44
49
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,QAAQ,EACR,KAAK,EACL,0BAA0B,EAC1B,YAAY,GACb,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,4BAA4B,EAC5B,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,0BAA0B,EAC1B,YAAY,GACb,MAAM,SAAS,CAAA"}
package/dist/index.js CHANGED
@@ -8,12 +8,16 @@
8
8
  *
9
9
  * @example
10
10
  * ```typescript
11
- * import { SarifToSlackService } from 'sarif-to-slack';
11
+ * import { SarifToSlackService, FooterType } from '@fabasoad/sarif-to-slack';
12
12
  *
13
- * const service = new SarifToSlackService({
13
+ * const service = await SarifToSlackService.create({
14
14
  * webhookUrl: 'https://hooks.slack.com/services/your/webhook/url',
15
15
  * sarifPath: 'path/to/your/sarif/file.sarif',
16
- * logLevel: 'info',
16
+ * log: {
17
+ * level: 'info',
18
+ * template: '[{{logLevelName}}] [{{name}}] {{dateIsoStr}} ',
19
+ * colored: false,
20
+ * },
17
21
  * username: 'SARIF Bot',
18
22
  * iconUrl: 'https://example.com/icon.png',
19
23
  * color: '#36a64f',
@@ -23,6 +27,7 @@
23
27
  * },
24
28
  * footer: {
25
29
  * include: true,
30
+ * type: FooterType.PLAIN_TEXT,
26
31
  * value: 'Generated by @fabasoad/sarif-to-slack'
27
32
  * },
28
33
  * actor: {
@@ -41,5 +46,5 @@
41
46
  * @packageDocumentation
42
47
  */
43
48
  export { SarifToSlackService } from './SarifToSlackService';
44
- export { LogLevel, } from './types';
45
- //# sourceMappingURL=index.js.map
49
+ export { CalculateResultsBy, FooterType, GroupResultsBy, LogLevel, } from './types';
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEZBQTBGO0FBRTFGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFDSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUMzRCxPQUFPLEVBQ0wsa0JBQWtCLEVBRWxCLFVBQVUsRUFDVixjQUFjLEVBR2QsUUFBUSxHQU1ULE1BQU0sU0FBUyxDQUFBIn0=
@@ -0,0 +1,17 @@
1
+ import type { Run } from 'sarif';
2
+ import { SecurityLevel, SecuritySeverity } from './types';
3
+ import { Map as ImmutableMap } from 'immutable';
4
+ export declare class SarifModelPerRun {
5
+ readonly toolName: string;
6
+ private readonly _securitySeverityMap;
7
+ private readonly _securityLevelMap;
8
+ constructor(run: Run);
9
+ private identifySecuritySeverity;
10
+ private identifySecurityLevel;
11
+ private buildSecuritySeverityMap;
12
+ private tryGetSecurityLevel;
13
+ private buildSecurityLevelMap;
14
+ get securitySeverityMap(): ImmutableMap<SecuritySeverity, number>;
15
+ get securityLevelMap(): ImmutableMap<SecurityLevel, number>;
16
+ }
17
+ //# sourceMappingURL=SarifModelPerRun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SarifModelPerRun.d.ts","sourceRoot":"","sources":["../../src/model/SarifModelPerRun.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,GAAG,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEzD,OAAO,EAAE,GAAG,IAAI,YAAY,EAAE,MAAM,WAAW,CAAA;AAM/C,qBAAa,gBAAgB;IAC3B,SAAgB,QAAQ,EAAE,MAAM,CAAA;IAEhC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwC;IAC7E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;gBAE3D,GAAG,EAAE,GAAG;IAUpB,OAAO,CAAC,wBAAwB;IA6BhC,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,qBAAqB;IAW7B,IAAW,mBAAmB,IAAI,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAEvE;IAED,IAAW,gBAAgB,IAAI,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAEjE;CACF"}
@@ -0,0 +1,84 @@
1
+ import { tryGetRulePropertyByResult } from '../utils/SarifUtils';
2
+ import { SecurityLevel, SecuritySeverity } from './types';
3
+ import Logger from '../Logger';
4
+ import { Map as ImmutableMap } from 'immutable';
5
+ import { sortSecurityLevelMap, sortSecuritySeverityMap } from '../utils/SortUtils';
6
+ export class SarifModelPerRun {
7
+ toolName;
8
+ _securitySeverityMap;
9
+ _securityLevelMap;
10
+ constructor(run) {
11
+ this.toolName = run.tool.driver.name;
12
+ this._securitySeverityMap = ImmutableMap().asMutable();
13
+ this._securityLevelMap = ImmutableMap().asMutable();
14
+ this.buildSecuritySeverityMap(run);
15
+ this.buildSecurityLevelMap(run);
16
+ }
17
+ identifySecuritySeverity(score) {
18
+ if (score === undefined) {
19
+ return SecuritySeverity.Unknown;
20
+ }
21
+ if (score >= 9 && score <= 10) {
22
+ return SecuritySeverity.Critical;
23
+ }
24
+ if (score >= 7) {
25
+ return SecuritySeverity.High;
26
+ }
27
+ if (score >= 4) {
28
+ return SecuritySeverity.Medium;
29
+ }
30
+ if (score >= 0.1) {
31
+ return SecuritySeverity.Low;
32
+ }
33
+ if (score == 0) {
34
+ return SecuritySeverity.None;
35
+ }
36
+ Logger.warn(`Unsupported "${score}" security severity. Saving as "Unknown".`);
37
+ return SecuritySeverity.Unknown;
38
+ }
39
+ identifySecurityLevel(level) {
40
+ if (level === undefined) {
41
+ return SecurityLevel.Unknown;
42
+ }
43
+ if (level.toLowerCase() === 'error') {
44
+ return SecurityLevel.Error;
45
+ }
46
+ if (level.toLowerCase() === 'warning') {
47
+ return SecurityLevel.Warning;
48
+ }
49
+ if (level.toLowerCase() === 'note') {
50
+ return SecurityLevel.Note;
51
+ }
52
+ Logger.warn(`Unsupported ${level} security level. Saving as "Unknown".`);
53
+ return SecurityLevel.Unknown;
54
+ }
55
+ buildSecuritySeverityMap(run) {
56
+ const results = run.results ?? [];
57
+ for (const result of results) {
58
+ const severity = this.identifySecuritySeverity(tryGetRulePropertyByResult(run, result, 'security-severity'));
59
+ const count = this._securitySeverityMap.get(severity) || 0;
60
+ this._securitySeverityMap.set(severity, count + 1);
61
+ }
62
+ }
63
+ tryGetSecurityLevel(run, result) {
64
+ if (result.level) {
65
+ return result.level;
66
+ }
67
+ return tryGetRulePropertyByResult(run, result, 'problem.severity');
68
+ }
69
+ buildSecurityLevelMap(run) {
70
+ const results = run.results ?? [];
71
+ for (const result of results) {
72
+ const level = this.identifySecurityLevel(this.tryGetSecurityLevel(run, result));
73
+ const count = this._securityLevelMap.get(level) || 0;
74
+ this._securityLevelMap.set(level, count + 1);
75
+ }
76
+ }
77
+ get securitySeverityMap() {
78
+ return sortSecuritySeverityMap(this._securitySeverityMap);
79
+ }
80
+ get securityLevelMap() {
81
+ return sortSecurityLevelMap(this._securityLevelMap);
82
+ }
83
+ }
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2FyaWZNb2RlbFBlclJ1bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC9TYXJpZk1vZGVsUGVyUnVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDekQsT0FBTyxNQUFNLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sRUFBRSxHQUFHLElBQUksWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsTUFBTSxPQUFPLGdCQUFnQjtJQUNYLFFBQVEsQ0FBUTtJQUVmLG9CQUFvQixDQUF3QztJQUM1RCxpQkFBaUIsQ0FBcUM7SUFFdkUsWUFBWSxHQUFRO1FBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFBO1FBRXBDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLEVBQTRCLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDaEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksRUFBeUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUUxRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxLQUFjO1FBQzdDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFBO1FBQ2pDLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlCLE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFBO1FBQ2xDLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNmLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFBO1FBQzlCLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNmLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxDQUFBO1FBQ2hDLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNqQixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQTtRQUM3QixDQUFDO1FBRUQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDZixPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQTtRQUM5QixDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsS0FBSywyQ0FBMkMsQ0FBQyxDQUFBO1FBQzdFLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFBO0lBQ2pDLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxLQUFjO1FBQzFDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQTtRQUM5QixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDcEMsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFBO1FBQzVCLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUE7UUFDOUIsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ25DLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQTtRQUMzQixDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssdUNBQXVDLENBQUMsQ0FBQTtRQUN4RSxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUE7SUFDOUIsQ0FBQztJQUVPLHdCQUF3QixDQUFDLEdBQVE7UUFDdkMsTUFBTSxPQUFPLEdBQWEsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFDM0MsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBcUIsSUFBSSxDQUFDLHdCQUF3QixDQUM5RCwwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQzdELENBQUE7WUFDRCxNQUFNLEtBQUssR0FBVyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNsRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxHQUFRLEVBQUUsTUFBYztRQUNsRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFDckIsQ0FBQztRQUVELE9BQU8sMEJBQTBCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxHQUFRO1FBQ3BDLE1BQU0sT0FBTyxHQUFhLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO1FBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsTUFBTSxLQUFLLEdBQWtCLElBQUksQ0FBQyxxQkFBcUIsQ0FDckQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FDdEMsQ0FBQTtZQUNELE1BQU0sS0FBSyxHQUFXLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDckQsQ0FBQztDQUNGIn0=
@@ -0,0 +1,20 @@
1
+ import type { SarifLog } from '../types';
2
+ import { Map as ImmutableMap } from 'immutable';
3
+ import { SecurityLevel, SecuritySeverity } from './types';
4
+ export type DataGroupedByRun<T> = {
5
+ toolName: string;
6
+ data: ImmutableMap<T, number>;
7
+ };
8
+ export declare class SarifModelPerSarif {
9
+ private readonly sarifModelPerRunList;
10
+ constructor(sarif: SarifLog);
11
+ private buildRunsList;
12
+ groupByToolNameWithSecurityLevel(): Map<string, ImmutableMap<SecurityLevel, number>>;
13
+ groupByRunWithSecurityLevel(): DataGroupedByRun<SecurityLevel>[];
14
+ groupByTotalWithSecurityLevel(): ImmutableMap<SecurityLevel, number>;
15
+ groupByToolNameWithSecuritySeverity(): Map<string, ImmutableMap<SecuritySeverity, number>>;
16
+ groupByRunWithSecuritySeverity(): DataGroupedByRun<SecuritySeverity>[];
17
+ groupByTotalWithSecuritySeverity(): ImmutableMap<SecuritySeverity, number>;
18
+ listToolNames(): Set<string>;
19
+ }
20
+ //# sourceMappingURL=SarifModelPerSarif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SarifModelPerSarif.d.ts","sourceRoot":"","sources":["../../src/model/SarifModelPerSarif.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,GAAG,IAAI,YAAY,EAAE,MAAM,WAAW,CAAA;AAE/C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAMzD,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;CAC9B,CAAA;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA0B;gBAEnD,KAAK,EAAE,QAAQ;IAK3B,OAAO,CAAC,aAAa;IAMd,gCAAgC,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAkBpF,2BAA2B,IAAI,gBAAgB,CAAC,aAAa,CAAC,EAAE;IAWhE,6BAA6B,IAAI,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;IAWpE,mCAAmC,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAkB1F,8BAA8B,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,EAAE;IAWtE,gCAAgC,IAAI,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAW1E,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC;CAOpC"}
@@ -0,0 +1,97 @@
1
+ import { Map as ImmutableMap } from 'immutable';
2
+ import { SarifModelPerRun } from './SarifModelPerRun';
3
+ import { sortSecurityLevelMap, sortSecuritySeverityMap } from '../utils/SortUtils';
4
+ export class SarifModelPerSarif {
5
+ sarifModelPerRunList;
6
+ constructor(sarif) {
7
+ this.sarifModelPerRunList = new Array();
8
+ this.buildRunsList(sarif);
9
+ }
10
+ buildRunsList(sarif) {
11
+ for (const run of sarif.runs) {
12
+ this.sarifModelPerRunList.push(new SarifModelPerRun(run));
13
+ }
14
+ }
15
+ groupByToolNameWithSecurityLevel() {
16
+ const result = new Map();
17
+ for (const sarifModelPerRun of this.sarifModelPerRunList) {
18
+ if (!result.has(sarifModelPerRun.toolName)) {
19
+ result.set(sarifModelPerRun.toolName, ImmutableMap().asMutable());
20
+ }
21
+ for (const [k, v] of sarifModelPerRun.securityLevelMap.entries()) {
22
+ const count = result.get(sarifModelPerRun.toolName)?.get(k) || 0;
23
+ result.get(sarifModelPerRun.toolName)?.set(k, count + v);
24
+ }
25
+ }
26
+ // Sort
27
+ for (const [k, v] of result) {
28
+ result.set(k, sortSecurityLevelMap(v));
29
+ }
30
+ return result;
31
+ }
32
+ groupByRunWithSecurityLevel() {
33
+ const result = new Array();
34
+ for (const sarifModelPerRun of this.sarifModelPerRunList) {
35
+ result.push({
36
+ toolName: sarifModelPerRun.toolName,
37
+ data: sarifModelPerRun.securityLevelMap,
38
+ });
39
+ }
40
+ return result;
41
+ }
42
+ groupByTotalWithSecurityLevel() {
43
+ const result = ImmutableMap().asMutable();
44
+ for (const sarifModelPerRun of this.sarifModelPerRunList) {
45
+ for (const [k, v] of sarifModelPerRun.securityLevelMap.entries()) {
46
+ const count = result.get(k) || 0;
47
+ result.set(k, count + v);
48
+ }
49
+ }
50
+ return sortSecurityLevelMap(result);
51
+ }
52
+ groupByToolNameWithSecuritySeverity() {
53
+ const result = new Map();
54
+ for (const sarifModelPerRun of this.sarifModelPerRunList) {
55
+ if (!result.has(sarifModelPerRun.toolName)) {
56
+ result.set(sarifModelPerRun.toolName, ImmutableMap().asMutable());
57
+ }
58
+ for (const [k, v] of sarifModelPerRun.securitySeverityMap.entries()) {
59
+ const count = result.get(sarifModelPerRun.toolName)?.get(k) || 0;
60
+ result.get(sarifModelPerRun.toolName)?.set(k, count + v);
61
+ }
62
+ }
63
+ // Sort
64
+ for (const [k, v] of result.entries()) {
65
+ result.set(k, sortSecuritySeverityMap(v));
66
+ }
67
+ return result;
68
+ }
69
+ groupByRunWithSecuritySeverity() {
70
+ const result = new Array();
71
+ for (const sarifModelPerRun of this.sarifModelPerRunList) {
72
+ result.push({
73
+ toolName: sarifModelPerRun.toolName,
74
+ data: sarifModelPerRun.securitySeverityMap,
75
+ });
76
+ }
77
+ return result;
78
+ }
79
+ groupByTotalWithSecuritySeverity() {
80
+ const result = ImmutableMap().asMutable();
81
+ for (const sarifModelPerRun of this.sarifModelPerRunList) {
82
+ for (const [k, v] of sarifModelPerRun.securitySeverityMap.entries()) {
83
+ const count = result.get(k) || 0;
84
+ result.set(k, count + v);
85
+ }
86
+ }
87
+ return sortSecuritySeverityMap(result);
88
+ }
89
+ listToolNames() {
90
+ const toolNames = new Set();
91
+ for (const sarifModelPerRun of this.sarifModelPerRunList) {
92
+ toolNames.add(sarifModelPerRun.toolName);
93
+ }
94
+ return toolNames;
95
+ }
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2FyaWZNb2RlbFBlclNhcmlmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL1NhcmlmTW9kZWxQZXJTYXJpZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxJQUFJLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUVyRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHVCQUF1QixFQUN4QixNQUFNLG9CQUFvQixDQUFDO0FBTzVCLE1BQU0sT0FBTyxrQkFBa0I7SUFDWixvQkFBb0IsQ0FBMEI7SUFFL0QsWUFBWSxLQUFlO1FBQ3pCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLEtBQUssRUFBb0IsQ0FBQTtRQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBZTtRQUNuQyxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGdDQUFnQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBK0MsQ0FBQTtRQUNyRSxLQUFLLE1BQU0sZ0JBQWdCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUF5QixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7WUFDMUYsQ0FBQztZQUNELEtBQUssTUFB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
@@ -0,0 +1,17 @@
1
+ export declare enum SecuritySeverity {
2
+ Unknown = "Unknown",
3
+ None = "None",
4
+ Low = "Low",
5
+ Medium = "Medium",
6
+ High = "High",
7
+ Critical = "Critical"
8
+ }
9
+ export declare const SecuritySeverityOrder: SecuritySeverity[];
10
+ export declare enum SecurityLevel {
11
+ Unknown = "Unknown",
12
+ Note = "Note",
13
+ Warning = "Warning",
14
+ Error = "Error"
15
+ }
16
+ export declare const SecurityLevelOrder: SecurityLevel[];
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/model/types.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB;IAC1B,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,QAAQ,aAAa;CACtB;AAED,eAAO,MAAM,qBAAqB,EAAE,gBAAgB,EAOnD,CAAA;AAED,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,aAAa,EAK7C,CAAA"}
@@ -0,0 +1,31 @@
1
+ export var SecuritySeverity;
2
+ (function (SecuritySeverity) {
3
+ SecuritySeverity["Unknown"] = "Unknown";
4
+ SecuritySeverity["None"] = "None";
5
+ SecuritySeverity["Low"] = "Low";
6
+ SecuritySeverity["Medium"] = "Medium";
7
+ SecuritySeverity["High"] = "High";
8
+ SecuritySeverity["Critical"] = "Critical";
9
+ })(SecuritySeverity || (SecuritySeverity = {}));
10
+ export const SecuritySeverityOrder = [
11
+ SecuritySeverity.Critical,
12
+ SecuritySeverity.High,
13
+ SecuritySeverity.Medium,
14
+ SecuritySeverity.Low,
15
+ SecuritySeverity.None,
16
+ SecuritySeverity.Unknown
17
+ ];
18
+ export var SecurityLevel;
19
+ (function (SecurityLevel) {
20
+ SecurityLevel["Unknown"] = "Unknown";
21
+ SecurityLevel["Note"] = "Note";
22
+ SecurityLevel["Warning"] = "Warning";
23
+ SecurityLevel["Error"] = "Error";
24
+ })(SecurityLevel || (SecurityLevel = {}));
25
+ export const SecurityLevelOrder = [
26
+ SecurityLevel.Error,
27
+ SecurityLevel.Warning,
28
+ SecurityLevel.Note,
29
+ SecurityLevel.Unknown
30
+ ];
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksZ0JBT1g7QUFQRCxXQUFZLGdCQUFnQjtJQUMxQix1Q0FBbUIsQ0FBQTtJQUNuQixpQ0FBYSxDQUFBO0lBQ2IsK0JBQVcsQ0FBQTtJQUNYLHFDQUFpQixDQUFBO0lBQ2pCLGlDQUFhLENBQUE7SUFDYix5Q0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBUFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQU8zQjtBQUVELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUF1QjtJQUN2RCxnQkFBZ0IsQ0FBQyxRQUFRO0lBQ3pCLGdCQUFnQixDQUFDLElBQUk7SUFDckIsZ0JBQWdCLENBQUMsTUFBTTtJQUN2QixnQkFBZ0IsQ0FBQyxHQUFHO0lBQ3BCLGdCQUFnQixDQUFDLElBQUk7SUFDckIsZ0JBQWdCLENBQUMsT0FBTztDQUN6QixDQUFBO0FBRUQsTUFBTSxDQUFOLElBQVksYUFLWDtBQUxELFdBQVksYUFBYTtJQUN2QixvQ0FBbUIsQ0FBQTtJQUNuQiw4QkFBYSxDQUFBO0lBQ2Isb0NBQW1CLENBQUE7SUFDbkIsZ0NBQWUsQ0FBQTtBQUNqQixDQUFDLEVBTFcsYUFBYSxLQUFiLGFBQWEsUUFLeEI7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBb0I7SUFDakQsYUFBYSxDQUFDLEtBQUs7SUFDbkIsYUFBYSxDQUFDLE9BQU87SUFDckIsYUFBYSxDQUFDLElBQUk7SUFDbEIsYUFBYSxDQUFDLE9BQU87Q0FDdEIsQ0FBQSJ9