@fabasoad/sarif-to-slack 0.2.0 → 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 (84) hide show
  1. package/.github/workflows/release.yml +3 -1
  2. package/.github/workflows/send-sarif-to-slack.yml +214 -0
  3. package/.pre-commit-config.yaml +3 -3
  4. package/.tool-versions +1 -1
  5. package/Makefile +9 -2
  6. package/README.md +1 -1
  7. package/dist/Logger.js +15 -6
  8. package/dist/Processors.js +23 -22
  9. package/dist/SarifToSlackService.d.ts.map +1 -1
  10. package/dist/SarifToSlackService.js +5 -6
  11. package/dist/SlackMessageBuilder.js +46 -52
  12. package/dist/index.d.ts +6 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +7 -3
  15. package/dist/model/SarifModelPerRun.d.ts +17 -0
  16. package/dist/model/SarifModelPerRun.d.ts.map +1 -0
  17. package/dist/model/SarifModelPerRun.js +84 -0
  18. package/dist/model/SarifModelPerSarif.d.ts +20 -0
  19. package/dist/model/SarifModelPerSarif.d.ts.map +1 -0
  20. package/dist/model/SarifModelPerSarif.js +97 -0
  21. package/dist/model/types.d.ts +17 -0
  22. package/dist/model/types.d.ts.map +1 -0
  23. package/dist/model/types.js +31 -0
  24. package/dist/sarif-to-slack.d.ts +96 -12
  25. package/dist/tsdoc-metadata.json +1 -1
  26. package/dist/types.d.ts +87 -11
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/types.js +66 -9
  29. package/dist/utils/SarifUtils.d.ts +5 -0
  30. package/dist/utils/SarifUtils.d.ts.map +1 -0
  31. package/dist/utils/SarifUtils.js +32 -0
  32. package/dist/utils/SortUtils.d.ts +5 -0
  33. package/dist/utils/SortUtils.d.ts.map +1 -0
  34. package/dist/utils/SortUtils.js +8 -0
  35. package/dist/version.d.ts +1 -1
  36. package/dist/version.js +1 -1
  37. package/etc/sarif-to-slack.api.md +32 -7
  38. package/jest.config.json +4 -4
  39. package/package.json +9 -7
  40. package/src/Logger.ts +20 -17
  41. package/src/Processors.ts +22 -22
  42. package/src/SarifToSlackService.ts +5 -6
  43. package/src/SlackMessageBuilder.ts +78 -63
  44. package/src/index.ts +10 -2
  45. package/src/model/SarifModelPerRun.ts +114 -0
  46. package/src/model/SarifModelPerSarif.ts +116 -0
  47. package/src/model/types.ts +31 -0
  48. package/src/types.ts +91 -11
  49. package/src/utils/SarifUtils.ts +44 -0
  50. package/src/utils/SortUtils.ts +21 -0
  51. package/src/version.ts +1 -1
  52. package/test-data/sarif/codeql-csharp.sarif +1 -0
  53. package/test-data/sarif/codeql-go.sarif +1 -0
  54. package/test-data/sarif/codeql-python.sarif +1 -0
  55. package/test-data/sarif/codeql-ruby.sarif +1 -0
  56. package/test-data/sarif/codeql-typescript.sarif +1 -0
  57. package/test-data/sarif/grype-container.sarif +1774 -0
  58. package/test-data/sarif/runs-1-tools-1-results-0.sarif +18 -0
  59. package/test-data/sarif/runs-2-tools-1-results-0.sarif +30 -0
  60. package/test-data/sarif/runs-2-tools-1.sarif +656 -0
  61. package/test-data/sarif/runs-2-tools-2-results-0.sarif +44 -0
  62. package/test-data/sarif/runs-2-tools-2.sarif +686 -0
  63. package/test-data/sarif/runs-3-tools-2-results-0.sarif +48 -0
  64. package/test-data/sarif/runs-3-tools-2.sarif +278 -0
  65. package/test-data/sarif/snyk-composer.sarif +934 -0
  66. package/test-data/sarif/snyk-container.sarif +313 -0
  67. package/test-data/sarif/snyk-gomodules.sarif +388 -0
  68. package/test-data/sarif/snyk-gradle.sarif +274 -0
  69. package/test-data/sarif/snyk-hex.sarif +66 -0
  70. package/test-data/sarif/snyk-maven.sarif +274 -0
  71. package/test-data/sarif/snyk-npm.sarif +896 -0
  72. package/test-data/sarif/snyk-nuget.sarif +90 -0
  73. package/test-data/sarif/snyk-pip.sarif +66 -0
  74. package/test-data/sarif/snyk-pnpm.sarif +90 -0
  75. package/test-data/sarif/snyk-poetry.sarif +1952 -0
  76. package/test-data/sarif/snyk-rubygems.sarif +440 -0
  77. package/test-data/sarif/snyk-sbt.sarif +178 -0
  78. package/test-data/sarif/snyk-swift.sarif +112 -0
  79. package/test-data/sarif/snyk-yarn.sarif +2900 -0
  80. package/test-data/sarif/trivy-iac.sarif +134 -0
  81. package/test-data/sarif/wiz-container.sarif +30916 -0
  82. package/test-data/sarif/wiz-iac.sarif +558 -0
  83. package/tests/Processors.spec.ts +3 -3
  84. package/tests/integration/SendSarifToSlack.spec.ts +56 -0
package/dist/index.d.ts CHANGED
@@ -12,7 +12,11 @@
12
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',
@@ -41,5 +45,5 @@
41
45
  * @packageDocumentation
42
46
  */
43
47
  export { SarifToSlackService } from './SarifToSlackService';
44
- export { FooterOptions, FooterType, IncludeAwareOptions, IncludeAwareWithValueOptions, LogLevel, Sarif, SarifToSlackServiceOptions, SlackMessage, } from './types';
48
+ export { CalculateResultsBy, FooterOptions, FooterType, GroupResultsBy, IncludeAwareOptions, IncludeAwareWithValueOptions, LogLevel, LogOptions, SarifLog, SarifToSlackOutput, SarifToSlackServiceOptions, SlackMessage, } from './types';
45
49
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EACL,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,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
@@ -13,7 +13,11 @@
13
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',
@@ -42,5 +46,5 @@
42
46
  * @packageDocumentation
43
47
  */
44
48
  export { SarifToSlackService } from './SarifToSlackService';
45
- export { FooterType, LogLevel, } from './types';
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEZBQTBGO0FBRTFGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlDRztBQUNILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQzNELE9BQU8sRUFFTCxVQUFVLEVBR1YsUUFBUSxHQUlULE1BQU0sU0FBUyxDQUFBIn0=
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
@@ -12,7 +12,11 @@
12
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',
@@ -43,6 +47,29 @@
43
47
 
44
48
  import type { Log } from 'sarif';
45
49
 
50
+ /**
51
+ * Enum representing how to calculate results.
52
+ * @public
53
+ */
54
+ export declare enum CalculateResultsBy {
55
+ /**
56
+ * Calculates results by the security level of the findings: Error, Warning,
57
+ * Note and Unknown. At first, it tries to get the security level from runs[].results[].level
58
+ * property. If it is not defined, it tries to get the security level from the
59
+ * respective rule of each result, using the rules[].properties['problem.severity']
60
+ * property.
61
+ */
62
+ Level = 0,
63
+ /**
64
+ * Calculates results by the security severity of the findings: Critical, High,
65
+ * Medium, Low, None and Unknown. it tries to get the security severity from the
66
+ * respective rule of each result, using the rules[].properties['security-severity']
67
+ * property. This property contains CVSS score, which is then mapped to the
68
+ * security severity value.
69
+ */
70
+ Severity = 1
71
+ }
72
+
46
73
  /**
47
74
  * Options for the footer of a Slack message. "type" is ignored if "value" is
48
75
  * not defined.
@@ -57,8 +84,36 @@ export declare type FooterOptions = IncludeAwareWithValueOptions & {
57
84
  * @public
58
85
  */
59
86
  export declare enum FooterType {
60
- PLAIN_TEXT = "plain_text",
61
- MARKDOWN = "mrkdwn"
87
+ /**
88
+ * Represents a plain text footer. Text is not formatted and appears as-is.
89
+ */
90
+ PlainText = "plain_text",
91
+ /**
92
+ * Represents a footer with Markdown formatting. Text can include formatting
93
+ * such as bold, italics, and links.
94
+ */
95
+ Markdown = "mrkdwn"
96
+ }
97
+
98
+ /**
99
+ * Enum representing how to group results.
100
+ * @public
101
+ */
102
+ export declare enum GroupResultsBy {
103
+ /**
104
+ * Groups results by the tool name. Particularly, groups by the runs[].tool.driver.name
105
+ * property from the SARIF file(s).
106
+ */
107
+ ToolName = 0,
108
+ /**
109
+ * Groups results by the run. It provides the result from each run individually.
110
+ */
111
+ Run = 1,
112
+ /**
113
+ * Does not group results. It provides the result from all the runs from all
114
+ * the provided SARIF files.
115
+ */
116
+ Total = 2
62
117
  }
63
118
 
64
119
  /**
@@ -85,7 +140,8 @@ export declare type IncludeAwareWithValueOptions = IncludeAwareOptions & {
85
140
  */
86
141
  export declare enum LogLevel {
87
142
  /**
88
- * Represents the most verbose logging level, typically used for detailed debugging information.
143
+ * Represents the most verbose logging level, typically used for detailed
144
+ * debugging information.
89
145
  */
90
146
  Silly = 0,
91
147
  /**
@@ -93,32 +149,59 @@ export declare enum LogLevel {
93
149
  */
94
150
  Trace = 1,
95
151
  /**
96
- * Represents a logging level for debugging information that is less verbose than silly.
152
+ * Represents a logging level for debugging information that is less verbose
153
+ * than silly.
97
154
  */
98
155
  Debug = 2,
99
156
  /**
100
- * Represents a logging level for general informational messages that highlight the progress of the application.
157
+ * Represents a logging level for general informational messages that highlight
158
+ * the progress of the application.
101
159
  */
102
160
  Info = 3,
103
161
  /**
104
- * Represents a logging level for potentially harmful situations that require attention.
162
+ * Represents a logging level for potentially harmful situations that require
163
+ * attention.
105
164
  */
106
165
  Warning = 4,
107
166
  /**
108
- * Represents a logging level for error conditions that do not require immediate action but should be noted.
167
+ * Represents a logging level for error conditions that do not require immediate
168
+ * action but should be noted.
109
169
  */
110
170
  Error = 5,
111
171
  /**
112
- * Represents a logging level for critical errors that require immediate attention and may cause the application to terminate.
172
+ * Represents a logging level for critical errors that require immediate attention
173
+ * and may cause the application to terminate.
113
174
  */
114
175
  Fatal = 6
115
176
  }
116
177
 
178
+ /**
179
+ * Options for logging.
180
+ * @public
181
+ */
182
+ export declare type LogOptions = {
183
+ level?: LogLevel;
184
+ /**
185
+ * More details here: https://github.com/fullstack-build/tslog?tab=readme-ov-file#pretty-templates-and-styles-color-settings
186
+ */
187
+ template?: string;
188
+ colored?: boolean;
189
+ };
190
+
117
191
  /**
118
192
  * Type representing a SARIF log.
119
193
  * @public
120
194
  */
121
- export declare type Sarif = Log;
195
+ export declare type SarifLog = Log;
196
+
197
+ /**
198
+ * Options for how to output the results in the Slack message.
199
+ * @public
200
+ */
201
+ export declare type SarifToSlackOutput = {
202
+ groupBy: GroupResultsBy;
203
+ calculateBy: CalculateResultsBy;
204
+ };
122
205
 
123
206
  /**
124
207
  * Service to convert SARIF files to Slack messages and send them.
@@ -168,11 +251,12 @@ export declare type SarifToSlackServiceOptions = {
168
251
  username?: string;
169
252
  iconUrl?: string;
170
253
  color?: string;
171
- logLevel?: LogLevel | string;
254
+ log?: LogOptions;
172
255
  header?: IncludeAwareWithValueOptions;
173
256
  footer?: FooterOptions;
174
257
  actor?: IncludeAwareWithValueOptions;
175
258
  run?: IncludeAwareOptions;
259
+ output?: SarifToSlackOutput;
176
260
  };
177
261
 
178
262
  /**
@@ -188,7 +272,7 @@ export declare interface SlackMessage {
188
272
  /**
189
273
  * The SARIF log associated with this Slack message.
190
274
  */
191
- sarif: Sarif;
275
+ sarif: SarifLog;
192
276
  }
193
277
 
194
278
  export { }
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.52.8"
8
+ "packageVersion": "7.52.9"
9
9
  }
10
10
  ]
11
11
  }