Skip to content

Commit a05d02b

Browse files
committed
Add SARIF support
1 parent c22c21d commit a05d02b

File tree

8 files changed

+809
-0
lines changed

8 files changed

+809
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### Features
2+
3+
* add support format: sarif ([#1045](https://github.com/htmlhint/HTMLHint/issues/1045))
4+
15
## [1.1.4](https://github.com/htmlhint/HTMLHint/compare/v1.1.3...v1.1.4) (2022-04-11)
26

37

dist/cli/formatters/sarif.js

Lines changed: 59 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/user-guide/usage/options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Options are:
2828
- `html`
2929
- `junit`
3030
- `markdown`
31+
- `sarif`
3132

3233
## `ignore`
3334

package-lock.json

Lines changed: 63 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
"glob": "^8.0.3",
6464
"is-glob": "^4.0.3",
6565
"node-fetch": "^2.6.2",
66+
"node-sarif-builder": "^2.0.3",
6667
"strip-json-comments": "3.1.0",
6768
"xml": "1.0.1"
6869
},

src/cli/formatters/sarif.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { FormatterCallback } from '../formatter'
2+
import {
3+
SarifBuilder,
4+
SarifResultBuilder,
5+
SarifRuleBuilder,
6+
SarifRunBuilder,
7+
} from 'node-sarif-builder'
8+
import * as path from 'path'
9+
import { pathToFileURL } from 'url'
10+
import { Result } from 'sarif'
11+
12+
const pkg = require('../../../package.json')
13+
14+
const sarifFormatter: FormatterCallback = function (formatter) {
15+
formatter.on('end', (event) => {
16+
const arrAllMessages = event.arrAllMessages
17+
18+
// SARIF builder
19+
const sarifBuilder = new SarifBuilder()
20+
21+
// SARIF Run builder
22+
const sarifRunBuilder = new SarifRunBuilder().initSimple({
23+
toolDriverName: 'HTMLHint',
24+
toolDriverVersion: pkg.version,
25+
url: 'https://htmlhint.com/',
26+
})
27+
28+
// SARIF rules
29+
const addedRuleSet = new Set<string>()
30+
arrAllMessages.forEach((result) => {
31+
result.messages.forEach((message) => {
32+
const rule = message.rule
33+
if (addedRuleSet.has(rule.id)) {
34+
return
35+
}
36+
addedRuleSet.add(rule.id)
37+
const sarifRuleBuiler = new SarifRuleBuilder().initSimple({
38+
ruleId: rule.id,
39+
shortDescriptionText: rule.description,
40+
helpUri: rule.link,
41+
})
42+
sarifRunBuilder.addRule(sarifRuleBuiler)
43+
})
44+
})
45+
46+
// Add SARIF results (individual errors)
47+
arrAllMessages.forEach((result) => {
48+
result.messages.forEach((message) => {
49+
const sarifResultBuilder = new SarifResultBuilder()
50+
const ruleId = message.rule.id
51+
const sarifResultInit = {
52+
level:
53+
message.type === 'info'
54+
? 'note'
55+
: (message.type.toString() as Result.level),
56+
messageText: message.message,
57+
ruleId: ruleId,
58+
fileUri: process.env.SARIF_URI_ABSOLUTE
59+
? pathToFileURL(result.file).toString()
60+
: path.relative(process.cwd(), result.file).replace(/\\/g, '/'),
61+
startLine: message.line,
62+
startColumn: message.col,
63+
endLine: message.line,
64+
endColumn: message.col,
65+
} as const
66+
sarifResultBuilder.initSimple(sarifResultInit)
67+
sarifRunBuilder.addResult(sarifResultBuilder)
68+
})
69+
})
70+
71+
sarifBuilder.addRun(sarifRunBuilder)
72+
console.log(sarifBuilder.buildSarifJsonString({ indent: true }))
73+
})
74+
}
75+
76+
module.exports = sarifFormatter

0 commit comments

Comments
 (0)