1 | #!/usr/bin/env node
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | const fs = require('fs')
|
11 | const execFile = require('child_process').execFile
|
12 |
|
13 | execFile('eslint', ['--format', 'json', process.argv[2]], (error, stdout) => {
|
14 | JSON.parse(stdout).forEach(result => {
|
15 | const filename = result.filePath
|
16 | const jsLines = fs.readFileSync(filename, 'utf8').split('\n')
|
17 | const offensesByLine = {}
|
18 | let addedLines = 0
|
19 |
|
20 |
|
21 | result.messages.forEach(message => {
|
22 | if (offensesByLine[message.line]) {
|
23 | offensesByLine[message.line].push(message.ruleId)
|
24 | } else {
|
25 | offensesByLine[message.line] = [message.ruleId]
|
26 | }
|
27 | })
|
28 |
|
29 | Object.keys(offensesByLine).forEach(line => {
|
30 | const lineIndex = line - 1 + addedLines
|
31 | const previousLine = jsLines[lineIndex - 1]
|
32 | const ruleIds = offensesByLine[line].join(', ')
|
33 | if (isDisableComment(previousLine)) {
|
34 | jsLines[lineIndex - 1] = previousLine.replace(/\s?\*\/$/, `, ${ruleIds} */`)
|
35 | } else {
|
36 | const leftPad = ' '.repeat(jsLines[lineIndex].match(/^\s*/g)[0].length)
|
37 | jsLines.splice(lineIndex, 0, `${leftPad}/* eslint-disable-next-line ${ruleIds} */`)
|
38 | }
|
39 | addedLines += 1
|
40 | })
|
41 |
|
42 | if (result.messages.length !== 0) {
|
43 | fs.writeFileSync(filename, jsLines.join('\n'), 'utf8')
|
44 | }
|
45 | })
|
46 | })
|
47 |
|
48 | function isDisableComment(line) {
|
49 | return line.match(/\/\* eslint-disable-next-line .+\*\//)
|
50 | }
|