@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
@@ -31,7 +31,7 @@ If applicable, add screenshots to help explain your problem.
31
31
  #### Technical information (please complete the following information)
32
32
 
33
33
  - OS: [e.g. Windows 10 Enterprise v.1909 (OS Build 18363.720)]
34
- - `sarif-to-slack-action` version [e.g. 0.1.0]
34
+ - `sarif-to-slack` version [e.g. 0.1.1]
35
35
 
36
36
  #### Additional context
37
37
 
@@ -4,12 +4,12 @@
4
4
 
5
5
  Please check if your PR fulfills the following requirements:
6
6
 
7
- - [ ] I have read the [CONTRIBUTING](https://github.com/fabasoad/sarif-to-slack-action/blob/main/CONTRIBUTING.md)
7
+ - [ ] I have read the [CONTRIBUTING](https://github.com/fabasoad/sarif-to-slack/blob/main/CONTRIBUTING.md)
8
8
  doc.
9
9
  - [ ] Tests for the changes have been added (for bug fixes / features).
10
10
  - [ ] Docs have been reviewed and added / updated if needed (for bug fixes / features).
11
- - [ ] Build (`yarn run build`) was run locally and any changes were pushed.
12
- - [ ] Tests (`yarn test`) has passed locally and any fixes were made for failures.
11
+ - [ ] Build (`make build`) was run locally and any changes were pushed.
12
+ - [ ] Tests (`make test`) has passed locally and any fixes were made for failures.
13
13
 
14
14
  ## Pull request type
15
15
 
@@ -6,13 +6,27 @@ on: # yamllint disable-line rule:truthy
6
6
  push:
7
7
  branches:
8
8
  - main
9
+ workflow_dispatch:
10
+ inputs:
11
+ linter:
12
+ description: |
13
+ The linter to run. Supported values: `js-lint`, `pre-commit`.
14
+ required: false
15
+ default: all
16
+ type: choice
17
+ options:
18
+ - all
19
+ - js-lint
20
+ - pre-commit
9
21
 
10
22
  jobs:
11
23
  js-lint:
12
24
  name: JS Lint
25
+ if: ${{ (github.event.inputs.linter || 'all') == 'all' || github.event.inputs.linter == 'js-lint' }}
13
26
  uses: fabasoad/reusable-workflows/.github/workflows/wf-js-lint.yml@main
14
27
  pre-commit:
15
28
  name: Pre-commit
29
+ if: ${{ (github.event.inputs.linter || 'all') == 'all' || github.event.inputs.linter == 'pre-commit' }}
16
30
  uses: fabasoad/reusable-workflows/.github/workflows/wf-pre-commit.yml@main
17
31
  with:
18
32
  skip-hooks: "audit, build, lint, test"
@@ -28,6 +28,8 @@ jobs:
28
28
  steps:
29
29
  - name: Checkout ${{ github.repository }}
30
30
  uses: actions/checkout@v4
31
+ with:
32
+ token: "${{ secrets.GH_TOKEN }}"
31
33
 
32
34
  - name: Setup Node
33
35
  uses: actions/setup-node@v4
@@ -40,10 +42,12 @@ jobs:
40
42
  run: npm ci
41
43
 
42
44
  - name: Bump version
45
+ env:
46
+ BUMP_STRATEGY: "${{ github.event.inputs.bump-strategy }}"
43
47
  run: |
44
48
  git config user.email "fabasoad@gmail.com"
45
49
  git config user.name "fabasoad"
46
- npm run version:${{ github.event.inputs.bump-strategy }}
50
+ npm run version:${BUMP_STRATEGY}
47
51
 
48
52
  - name: Install jq
49
53
  uses: dcarbone/install-jq-action@v3
@@ -0,0 +1,214 @@
1
+ ---
2
+ name: Send SARIF to Slack
3
+
4
+ on: # yamllint disable-line rule:truthy
5
+ workflow_dispatch:
6
+ inputs:
7
+ sarif:
8
+ description: SARIF to send
9
+ required: true
10
+ default: "Snyk Yarn (Error: 30, Warning: 16, Note: 3)"
11
+ type: choice
12
+ options:
13
+ - "CodeQL C# (Unknown: 1)"
14
+ - "CodeQL Go (Unknown: 1)"
15
+ - "CodeQL Python (Unknown: 1)"
16
+ - "CodeQL Ruby (Unknown: 4)"
17
+ - "CodeQL TypeScript (Unknown: 1)"
18
+ - "Grype Container (Error: 10, Warning: 20, Note: 9)"
19
+ - "Snyk Composer (Error: 15, Warning: 5)"
20
+ - "Snyk Container (Error: 1, Note: 3)"
21
+ - "Snyk Gomodules (Error: 4, Warning: 4)"
22
+ - "Snyk Gradle (Error: 3, Warning: 1)"
23
+ - "Snyk Hex (Error: 1)"
24
+ - "Snyk Maven (Error: 3, Warning: 1)"
25
+ - "Snyk NPM (Error: 6, Warning: 6, Note: 2)"
26
+ - "Snyk Nuget (Error: 1)"
27
+ - "Snyk Pip (Warning: 1)"
28
+ - "Snyk PNPM (Error: 1)"
29
+ - "Snyk Poetry (Error: 6, Warning: 21, Note: 2)"
30
+ - "Snyk Rubygems (Error: 1, Warning: 5)"
31
+ - "Snyk Sbt (Error: 2, Warning: 1)"
32
+ - "Snyk Swift (Warning: 2)"
33
+ - "Snyk Yarn (Error: 30, Warning: 16, Note: 3)"
34
+ - "Trivy IaC (Error: 1, Note: 1)"
35
+ - "Wiz Container (Error: 12, Warning: 369, Note: 191)"
36
+ - "Wiz IaC (Warning: 5, Note: 5)"
37
+ - "Runs: 1, Tools: 1, Results: 0"
38
+ - "Runs: 2, Tools: 1, Results > 0"
39
+ - "Runs: 2, Tools: 1, Results: 0"
40
+ - "Runs: 2, Tools: 2, Results > 0"
41
+ - "Runs: 2, Tools: 2, Results: 0"
42
+ - "Runs: 3, Tools: 2, Results > 0"
43
+ - "Runs: 3, Tools: 2, Results: 0"
44
+ - "All"
45
+ group-by:
46
+ description: "Group results by:"
47
+ required: false
48
+ default: "Tool name"
49
+ type: choice
50
+ options:
51
+ - "Tool name"
52
+ - "Run"
53
+ - "Total"
54
+ calculate-by:
55
+ description: "Calculate results by:"
56
+ required: false
57
+ default: "Level"
58
+ type: choice
59
+ options:
60
+ - "Level"
61
+ - "Severity"
62
+ log-level:
63
+ description: "Log level:"
64
+ required: false
65
+ default: info
66
+ type: choice
67
+ options:
68
+ - silly
69
+ - trace
70
+ - debug
71
+ - info
72
+ - warning
73
+ - error
74
+ - fatal
75
+ color:
76
+ description: "Slack message color (hex):"
77
+ required: false
78
+ default: "#ff0000"
79
+ type: string
80
+ username:
81
+ description: "Slack message username:"
82
+ required: false
83
+ type: string
84
+ header:
85
+ description: |
86
+ Header (leave empty for default value, set to "skip" to not include it,
87
+ or set to any string to use it as a header):
88
+ required: false
89
+ default: "skip"
90
+ type: string
91
+ footer:
92
+ description: |
93
+ Footer (leave empty for default value, set to "skip" to not include it,
94
+ or set to any string to use it as a footer):
95
+ required: false
96
+ type: string
97
+ actor:
98
+ description: |
99
+ Actor (leave empty for default value, set to "skip" to not include it,
100
+ or set to any string to use it as an actor):
101
+ required: false
102
+ default: "skip"
103
+ type: string
104
+ include-run:
105
+ description: Include run in the message.
106
+ required: false
107
+ default: true
108
+ type: boolean
109
+
110
+ defaults:
111
+ run:
112
+ shell: sh
113
+
114
+ jobs:
115
+ send-sarif:
116
+ name: ${{ inputs.sarif }}
117
+ timeout-minutes: 5
118
+ runs-on: ubuntu-latest
119
+ steps:
120
+ - name: Checkout ${{ github.repository }}
121
+ uses: actions/checkout@v4
122
+ - name: Determine SARIF file
123
+ id: sarif-file
124
+ env:
125
+ INPUT_SARIF: "${{ inputs.sarif }}"
126
+ run: |
127
+ if [ "${INPUT_SARIF}" = "CodeQL C# (Unknown: 1)" ]; then
128
+ value="codeql-csharp.sarif"
129
+ elif [ "${INPUT_SARIF}" = "CodeQL Go (Unknown: 1)" ]; then
130
+ value="codeql-go.sarif"
131
+ elif [ "${INPUT_SARIF}" = "CodeQL Python (Unknown: 1)" ]; then
132
+ value="codeql-python.sarif"
133
+ elif [ "${INPUT_SARIF}" = "CodeQL Ruby (Unknown: 4)" ]; then
134
+ value="codeql-ruby.sarif"
135
+ elif [ "${INPUT_SARIF}" = "CodeQL TypeScript (Unknown: 1)" ]; then
136
+ value="codeql-typescript.sarif"
137
+ elif [ "${INPUT_SARIF}" = "Grype Container (Error: 10, Warning: 20, Note: 9)" ]; then
138
+ value="grype-container.sarif"
139
+ elif [ "${INPUT_SARIF}" = "Snyk Composer (Error: 15, Warning: 5)" ]; then
140
+ value="snyk-composer.sarif"
141
+ elif [ "${INPUT_SARIF}" = "Snyk Container (Error: 1, Note: 3)" ]; then
142
+ value="snyk-container.sarif"
143
+ elif [ "${INPUT_SARIF}" = "Snyk Gomodules (Error: 4, Warning: 4)" ]; then
144
+ value="snyk-gomodules.sarif"
145
+ elif [ "${INPUT_SARIF}" = "Snyk Gradle (Error: 3, Warning: 1)" ]; then
146
+ value="snyk-gradle.sarif"
147
+ elif [ "${INPUT_SARIF}" = "Snyk Hex (Error: 1)" ]; then
148
+ value="snyk-hex.sarif"
149
+ elif [ "${INPUT_SARIF}" = "Snyk Maven (Error: 3, Warning: 1)" ]; then
150
+ value="snyk-maven.sarif"
151
+ elif [ "${INPUT_SARIF}" = "Snyk NPM (Error: 6, Warning: 6, Note: 2)" ]; then
152
+ value="snyk-npm.sarif"
153
+ elif [ "${INPUT_SARIF}" = "Snyk Nuget (Error: 1)" ]; then
154
+ value="snyk-nuget.sarif"
155
+ elif [ "${INPUT_SARIF}" = "Snyk Pip (Warning: 1)" ]; then
156
+ value="snyk-pip.sarif"
157
+ elif [ "${INPUT_SARIF}" = "Snyk PNPM (Error: 1)" ]; then
158
+ value="snyk-pnpm.sarif"
159
+ elif [ "${INPUT_SARIF}" = "Snyk Poetry (Error: 6, Warning: 21, Note: 2)" ]; then
160
+ value="snyk-poetry.sarif"
161
+ elif [ "${INPUT_SARIF}" = "Snyk Rubygems (Error: 1, Warning: 5)" ]; then
162
+ value="snyk-rubygems.sarif"
163
+ elif [ "${INPUT_SARIF}" = "Snyk Sbt (Error: 2, Warning: 1)" ]; then
164
+ value="snyk-sbt.sarif"
165
+ elif [ "${INPUT_SARIF}" = "Snyk Swift (Warning: 2)" ]; then
166
+ value="snyk-swift.sarif"
167
+ elif [ "${INPUT_SARIF}" = "Snyk Yarn (Error: 30, Warning: 16, Note: 3)" ]; then
168
+ value="snyk-yarn.sarif"
169
+ elif [ "${INPUT_SARIF}" = "Trivy IaC (Error: 1, Note: 1)" ]; then
170
+ value="trivy-iac.sarif"
171
+ elif [ "${INPUT_SARIF}" = "Wiz Container (Error: 12, Warning: 369, Note: 191)" ]; then
172
+ value="wiz-container.sarif"
173
+ elif [ "${INPUT_SARIF}" = "Wiz IaC (Warning: 5, Note: 5)" ]; then
174
+ value="wiz-iac.sarif"
175
+ elif [ "${INPUT_SARIF}" = "Runs: 1, Tools: 1, Results: 0" ]; then
176
+ value="runs-1-tools-1-results-0.sarif"
177
+ elif [ "${INPUT_SARIF}" = "Runs: 2, Tools: 1, Results > 0" ]; then
178
+ value="runs-2-tools-1.sarif"
179
+ elif [ "${INPUT_SARIF}" = "Runs: 2, Tools: 1, Results: 0" ]; then
180
+ value="runs-2-tools-1-results-0.sarif"
181
+ elif [ "${INPUT_SARIF}" = "Runs: 2, Tools: 2, Results > 0" ]; then
182
+ value="runs-2-tools-2.sarif"
183
+ elif [ "${INPUT_SARIF}" = "Runs: 2, Tools: 2, Results: 0" ]; then
184
+ value="runs-2-tools-2-results-0.sarif"
185
+ elif [ "${INPUT_SARIF}" = "Runs: 3, Tools: 2, Results > 0" ]; then
186
+ value="runs-3-tools-2.sarif"
187
+ elif [ "${INPUT_SARIF}" = "Runs: 3, Tools: 2, Results: 0" ]; then
188
+ value="runs-3-tools-2-results-0.sarif"
189
+ else
190
+ # All
191
+ value=""
192
+ fi
193
+ echo "value=${value}" >> "$GITHUB_OUTPUT"
194
+ - name: Setup node
195
+ uses: actions/setup-node@v4
196
+ with:
197
+ node-version-file: ".tool-versions"
198
+ - name: Install dependencies
199
+ run: npm ci
200
+ - name: Send message
201
+ env:
202
+ SARIF_TO_SLACK_WEBHOOK_URL: "${{ secrets.TMP_EUGENE_SLACK_WEBHOOK }}"
203
+ SARIF_TO_SLACK_USERNAME: "${{ inputs.username }}"
204
+ SARIF_TO_SLACK_ICON_URL: "https://cdn-icons-png.flaticon.com/512/9070/9070006.png"
205
+ SARIF_TO_SLACK_COLOR: "${{ inputs.color }}"
206
+ SARIF_TO_SLACK_SARIF_FILE_NAME: "${{ steps.sarif-file.outputs.value }}"
207
+ SARIF_TO_SLACK_LOG_LEVEL: "${{ inputs.log-level }}"
208
+ SARIF_TO_SLACK_HEADER: "${{ inputs.header }}"
209
+ SARIF_TO_SLACK_FOOTER: "${{ inputs.footer }}"
210
+ SARIF_TO_SLACK_ACTOR: "${{ inputs.actor }}"
211
+ SARIF_TO_SLACK_INCLUDE_RUN: "${{ inputs.include-run }}"
212
+ SARIF_TO_SLACK_GROUP_BY: "${{ inputs.group-by}}"
213
+ SARIF_TO_SLACK_CALCULATE_BY: "${{ inputs.calculate-by}}"
214
+ run: npm run test:integration
@@ -9,6 +9,7 @@ on: # yamllint disable-line rule:truthy
9
9
  - jest.config.json
10
10
  - package.json
11
11
  - src/**
12
+ - tests/**
12
13
  - tsconfig.json
13
14
  push:
14
15
  branches:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  default_install_hook_types: ["pre-commit", "pre-push"]
3
3
  default_stages: ["pre-commit", "pre-push"]
4
- exclude: ^(dist/.*|etc/.*|lib/.*|node_modules/.*|temp/.*)$
4
+ exclude: ^(dist/.*|etc/.*|node_modules/.*|temp/.*|test-data/.*)$
5
5
  minimum_pre_commit_version: 4.0.0
6
6
  repos:
7
7
  - repo: local
@@ -40,7 +40,7 @@ repos:
40
40
  hooks:
41
41
  - id: detect-secrets
42
42
  - repo: https://github.com/gitleaks/gitleaks
43
- rev: v8.27.2
43
+ rev: v8.28.0
44
44
  hooks:
45
45
  - id: gitleaks
46
46
  - repo: https://github.com/fabasoad/pre-commit-snyk
@@ -60,7 +60,7 @@ repos:
60
60
  - --hook-args=--log-level debug
61
61
  stages: ["pre-push"]
62
62
  - repo: https://github.com/google/osv-scanner
63
- rev: v2.0.3
63
+ rev: v2.1.0
64
64
  hooks:
65
65
  - id: osv-scanner
66
66
  args:
package/.tool-versions CHANGED
@@ -1 +1 @@
1
- nodejs 24.3.0
1
+ nodejs 24.4.1
package/CONTRIBUTING.md CHANGED
@@ -33,7 +33,7 @@ In short, when you submit code changes, your submissions are understood to be
33
33
  under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers
34
34
  the project. Feel free to contact the maintainers if that's a concern.
35
35
 
36
- ## Report bugs using [GitHub Issues](https://github.com/fabasoad/sarif-to-slack-action/issues)
36
+ ## Report bugs using [GitHub Issues](https://github.com/fabasoad/sarif-to-slack/issues)
37
37
 
38
38
  We use GitHub issues to track public bugs. Report a bug by opening a new issue.
39
39
  It's that easy!
package/Makefile CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  .PHONY: audit
4
4
  audit:
5
- @npm audit --all
5
+ @npm audit --audit-level moderate --package-lock-only --include dev
6
6
 
7
7
  .PHONY: build
8
8
  build:
@@ -26,10 +26,17 @@ reinstall:
26
26
  lint:
27
27
  @npm run lint
28
28
 
29
- .PHONY: test
30
- test:
29
+ .PHONY: test/integration
30
+ test/integration:
31
+ @npm run test:integration
32
+
33
+ .PHONY: test/unit
34
+ test/unit:
31
35
  @npm run test
32
36
 
37
+ .PHONY: test
38
+ test: test/unit
39
+
33
40
  .PHONY: npm/update
34
41
  npm/update:
35
42
  @npm update
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # SARIF to Slack TypeScript Library
2
2
 
3
3
  [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua)
4
- ![Releases](https://img.shields.io/github/v/release/fabasoad/sarif-to-slack-action?include_prereleases)
5
- ![unit-tests](https://github.com/fabasoad/sarif-to-slack-action/actions/workflows/unit-tests.yml/badge.svg)
6
- ![security](https://github.com/fabasoad/sarif-to-slack-action/actions/workflows/security.yml/badge.svg)
7
- ![linting](https://github.com/fabasoad/sarif-to-slack-action/actions/workflows/linting.yml/badge.svg)
8
- [![codecov](https://codecov.io/gh/fabasoad/sarif-to-slack-action/branch/main/graph/badge.svg?token=908QOYME6H)](https://codecov.io/gh/fabasoad/sarif-to-slack-action)
4
+ ![Releases](https://img.shields.io/github/v/release/fabasoad/sarif-to-slack?include_prereleases)
5
+ ![unit-tests](https://github.com/fabasoad/sarif-to-slack/actions/workflows/unit-tests.yml/badge.svg)
6
+ ![security](https://github.com/fabasoad/sarif-to-slack/actions/workflows/security.yml/badge.svg)
7
+ ![linting](https://github.com/fabasoad/sarif-to-slack/actions/workflows/linting.yml/badge.svg)
8
+ [![codecov](https://codecov.io/github/fabasoad/sarif-to-slack/graph/badge.svg?token=I4FV5Q328I)](https://codecov.io/github/fabasoad/sarif-to-slack)
9
9
 
10
10
  TypeScript library to send results of SARIF file to Slack webhook URL.
11
11
 
@@ -16,19 +16,50 @@ TypeScript library to send results of SARIF file to Slack webhook URL.
16
16
  * [Contents](#contents)
17
17
  * [How to use](#how-to-use)
18
18
  * [Sample](#sample)
19
+ * [References](#references)
19
20
  * [Contributions](#contributions)
20
21
  <!-- TOC -->
21
22
 
22
23
  ## How to use
23
24
 
24
25
  ```typescript
26
+ import { SarifToSlackService, FooterType } from '@fabasoad/sarif-to-slack';
25
27
 
28
+ const service = await SarifToSlackService.create({
29
+ webhookUrl: 'https://hooks.slack.com/services/your/webhook/url',
30
+ sarifPath: 'path/to/your/sarif/file.sarif',
31
+ logLevel: 'info',
32
+ username: 'SARIF Bot',
33
+ iconUrl: 'https://example.com/icon.png',
34
+ color: '#36a64f',
35
+ header: {
36
+ include: true,
37
+ value: 'SARIF Analysis Results',
38
+ },
39
+ footer: {
40
+ include: true,
41
+ type: FooterType.PLAIN_TEXT,
42
+ value: 'Generated by @fabasoad/sarif-to-slack',
43
+ },
44
+ actor: {
45
+ include: true,
46
+ value: 'fabasoad',
47
+ },
48
+ run: {
49
+ include: true,
50
+ },
51
+ });
52
+ await service.sendAll();
26
53
  ```
27
54
 
28
55
  ## Sample
29
56
 
30
57
  <img alt="Sample" src="sample.png" width="450"/>
31
58
 
59
+ ## References
60
+
61
+ * [API Report](./etc/sarif-to-slack.api.md)
62
+
32
63
  ## Contributions
33
64
 
34
65
  ![Alt](https://repobeats.axiom.co/api/embed/a0989b54292b5c9e03ce1dd4cb23f68072f88f46.svg "Repobeats analytics image")
package/biome.json CHANGED
@@ -3,12 +3,12 @@
3
3
  "enabled": true,
4
4
  "rules": {
5
5
  "recommended": false,
6
- "a11y": { "noBlankTarget": "error" },
6
+ "a11y": "off",
7
7
  "complexity": {
8
+ "noAdjacentSpacesInRegex": "error",
9
+ "noArguments": "error",
8
10
  "noExtraBooleanCast": "error",
9
- "noMultipleSpacesInRegularExpressionLiterals": "error",
10
- "noUselessCatch": "error",
11
- "noWith": "error"
11
+ "noUselessCatch": "error"
12
12
  },
13
13
  "correctness": {
14
14
  "noChildrenProp": "error",
@@ -19,7 +19,7 @@
19
19
  "noGlobalObjectCalls": "error",
20
20
  "noInnerDeclarations": "error",
21
21
  "noInvalidConstructorSuper": "error",
22
- "noNewSymbol": "error",
22
+ "noInvalidBuiltinInstantiation": "error",
23
23
  "noNonoctalDecimalEscape": "error",
24
24
  "noPrecisionLoss": "error",
25
25
  "noSelfAssign": "error",
@@ -35,12 +35,14 @@
35
35
  "useIsNan": "error",
36
36
  "useJsxKeyInIterable": "error",
37
37
  "useValidForDirection": "error",
38
+ "useValidTypeof": "error",
38
39
  "useYield": "error"
39
40
  },
40
- "security": { "noDangerouslySetInnerHtml": "error" },
41
+ "security": {
42
+ "noBlankTarget": "error",
43
+ "noDangerouslySetInnerHtml": "error"
44
+ },
41
45
  "style": {
42
- "noArguments": "error",
43
- "noVar": "error",
44
46
  "useBlockStatements": "error",
45
47
  "useConst": "error",
46
48
  "useSingleVarDeclarator": "error"
@@ -67,15 +69,16 @@
67
69
  "noPrototypeBuiltins": "error",
68
70
  "noRedeclare": "error",
69
71
  "noShadowRestrictedNames": "error",
72
+ "noVar": "error",
73
+ "noWith": "error",
70
74
  "noUnsafeNegation": "error",
71
- "useGetterReturn": "error",
72
- "useValidTypeof": "error"
75
+ "useGetterReturn": "error"
73
76
  }
74
77
  },
75
- "ignore": ["dist/**"]
78
+ "includes": ["src/**", "tests/**"]
76
79
  },
77
80
  "javascript": {
78
81
  "globals": ["Atomics", "SharedArrayBuffer", "jest", "afterEach", "beforeAll", "beforeEach", "expect", "test", "describe"]
79
82
  },
80
- "overrides": [{ "include": ["**/*.spec.ts", "**/*.spec.tsx"] }]
83
+ "overrides": [{ "includes": ["**/*.spec.ts", "**/*.spec.tsx"] }]
81
84
  }
package/dist/Logger.js CHANGED
@@ -5,19 +5,30 @@ import { LogLevel } from './types';
5
5
  * @internal
6
6
  */
7
7
  export default class Logger {
8
- static instance = new TSLogger();
9
- static initialize({ logLevel = LogLevel.Info }) {
8
+ static DEFAULT_LOG_LEVEL = LogLevel.Info;
9
+ static DEFAULT_LOG_TEMPLATE = '[{{logLevelName}}] [{{name}}] {{dateIsoStr}} ';
10
+ static DEFAULT_LOG_COLORED = true;
11
+ static instance;
12
+ static initialize(opts) {
10
13
  if (!Logger.instance) {
11
14
  Logger.instance = new TSLogger({
12
- minLevel: process.env.ACTIONS_STEP_DEBUG === 'true' ? 0 : logLevel,
15
+ name: '@fabasoad/sarif-to-slack',
16
+ minLevel: process.env.ACTIONS_STEP_DEBUG === 'true' ? LogLevel.Silly : (opts?.level ?? Logger.DEFAULT_LOG_LEVEL),
17
+ type: 'pretty',
18
+ prettyLogTimeZone: 'UTC',
19
+ prettyLogTemplate: opts?.template ?? Logger.DEFAULT_LOG_TEMPLATE,
20
+ stylePrettyLogs: opts?.colored ?? Logger.DEFAULT_LOG_COLORED,
13
21
  });
14
22
  }
15
23
  }
24
+ static warn(...args) {
25
+ Logger.instance.warn(...args);
26
+ }
16
27
  static info(...args) {
17
- Logger.instance.info(args);
28
+ Logger.instance.info(...args);
18
29
  }
19
30
  static debug(...args) {
20
- Logger.instance.debug(args);
31
+ Logger.instance.debug(...args);
21
32
  }
22
33
  }
23
- //# sourceMappingURL=Logger.js.map
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFjLE1BQU0sU0FBUyxDQUFBO0FBRTlDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTTtJQUNqQixNQUFNLENBQUMsaUJBQWlCLEdBQWEsUUFBUSxDQUFDLElBQUksQ0FBQTtJQUNsRCxNQUFNLENBQUMsb0JBQW9CLEdBQVcsK0NBQStDLENBQUE7SUFDckYsTUFBTSxDQUFDLG1CQUFtQixHQUFZLElBQUksQ0FBQTtJQUUxQyxNQUFNLENBQUMsUUFBUSxDQUFtQjtJQUVuQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQWlCO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQztnQkFDN0IsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDO2dCQUNoSCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxpQkFBaUIsRUFBRSxLQUFLO2dCQUN4QixpQkFBaUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxJQUFJLE1BQU0sQ0FBQyxvQkFBb0I7Z0JBQ2hFLGVBQWUsRUFBRSxJQUFJLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUI7YUFDN0QsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBZTtRQUNuQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFFTSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBZTtRQUNuQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBZTtRQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ2hDLENBQUMifQ==
@@ -1,6 +1,7 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import Logger from './Logger';
4
+ import { LogLevel } from './types';
4
5
  /**
5
6
  * Processes a color string and converts it to a specific hex code if it matches
6
7
  * a CI status identifier.
@@ -25,7 +26,7 @@ export function processColor(color) {
25
26
  Logger.info(`Converting "${color}" to #808080`);
26
27
  return '#808080';
27
28
  default:
28
- Logger.debug(`"${color}" color is not a CI status identifier. Returning as is...`);
29
+ Logger.debug(`"${color}" color is not a CI status identifier. Returning as is.`);
29
30
  return color;
30
31
  }
31
32
  }
@@ -37,27 +38,27 @@ export function processColor(color) {
37
38
  * @internal
38
39
  */
39
40
  export function processLogLevel(logLevel) {
40
- if (typeof logLevel === 'string') {
41
- switch (logLevel.toLowerCase()) {
42
- case 'silly':
43
- return 0;
44
- case 'trace':
45
- return 1;
46
- case 'debug':
47
- return 2;
48
- case 'info':
49
- return 3;
50
- case 'warning':
51
- return 4;
52
- case 'error':
53
- return 5;
54
- case 'fatal':
55
- return 6;
56
- default:
57
- throw new Error(`Unknown log level: ${logLevel}`);
58
- }
41
+ if (!logLevel) {
42
+ return undefined;
43
+ }
44
+ switch (logLevel.toLowerCase()) {
45
+ case 'silly':
46
+ return LogLevel.Silly;
47
+ case 'trace':
48
+ return LogLevel.Trace;
49
+ case 'debug':
50
+ return LogLevel.Debug;
51
+ case 'info':
52
+ return LogLevel.Info;
53
+ case 'warning':
54
+ return LogLevel.Warning;
55
+ case 'error':
56
+ return LogLevel.Error;
57
+ case 'fatal':
58
+ return LogLevel.Fatal;
59
+ default:
60
+ throw new Error(`Unknown log level: ${logLevel}`);
59
61
  }
60
- return logLevel;
61
62
  }
62
63
  /**
63
64
  * Processes the SARIF path, which can be a file or a directory. If it's a
@@ -88,4 +89,4 @@ export function processSarifPath(sarifPath) {
88
89
  }
89
90
  throw new Error(`"sarif-path" is neither a file nor a directory: ${sarifPath}`);
90
91
  }
91
- //# sourceMappingURL=Processors.js.map
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvY2Vzc29ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Qcm9jZXNzb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sTUFBTSxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBRWxDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFNBQVM7WUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxjQUFjLENBQUMsQ0FBQTtZQUMvQyxPQUFPLFNBQVMsQ0FBQTtRQUNsQixLQUFLLFNBQVM7WUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxjQUFjLENBQUMsQ0FBQTtZQUMvQyxPQUFPLFNBQVMsQ0FBQTtRQUNsQixLQUFLLFdBQVc7WUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxjQUFjLENBQUMsQ0FBQTtZQUMvQyxPQUFPLFNBQVMsQ0FBQTtRQUNsQixLQUFLLFNBQVM7WUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxjQUFjLENBQUMsQ0FBQTtZQUMvQyxPQUFPLFNBQVMsQ0FBQTtRQUNsQjtZQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLHlEQUF5RCxDQUFDLENBQUE7WUFDaEYsT0FBTyxLQUFLLENBQUE7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWlCO0lBQy9DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxRQUFRLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQy9CLEtBQUssT0FBTztZQUNWLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQTtRQUN2QixLQUFLLE9BQU87WUFDVixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUE7UUFDdkIsS0FBSyxPQUFPO1lBQ1YsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFBO1FBQ3ZCLEtBQUssTUFBTTtZQUNULE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQTtRQUN0QixLQUFLLFNBQVM7WUFDWixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUE7UUFDekIsS0FBSyxPQUFPO1lBQ1YsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFBO1FBQ3ZCLEtBQUssT0FBTztZQUNWLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQTtRQUN2QjtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDckQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsU0FBaUI7SUFDaEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRW5ELElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUN4RCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pELE1BQU0sYUFBYSxHQUFhLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUM1RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FDOUMsQ0FBQTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxhQUFhLENBQUMsTUFBTSxtQkFBbUIsU0FBUyxZQUFZLENBQUMsQ0FBQTtRQUNsRixNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNqRSxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUNuRCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDcEIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELFNBQVMsRUFBRSxDQUFDLENBQUE7QUFDakYsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"SarifToSlackService.d.ts","sourceRoot":"","sources":["../src/SarifToSlackService.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,0BAA0B,EAC1B,YAAY,EACb,MAAM,SAAS,CAAA;AAmChB;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAE3D,OAAO;IAIP;;;;OAIG;IACH,IAAW,aAAa,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAE5D;IAED;;;;;;OAMG;WACiB,MAAM,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAU1F;;;;;OAKG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC;;;;;;OAMG;IACU,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQpD"}
1
+ {"version":3,"file":"SarifToSlackService.d.ts","sourceRoot":"","sources":["../src/SarifToSlackService.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,0BAA0B,EAC1B,YAAY,EACb,MAAM,SAAS,CAAA;AAoChB;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAE3D,OAAO;IAIP;;;;OAIG;IACH,IAAW,aAAa,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAE5D;IAED;;;;;;OAMG;WACiB,MAAM,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQ1F;;;;;OAKG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC;;;;;;OAMG;IACU,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQpD"}