UNPKG

1.75 kBJavaScriptView Raw
1#!/usr/bin/env node
2// Disables eslint rules in a JavaScript file with next-line comments. This is
3// useful when introducing a new rule that causes many failures. The comments
4// can be fixed and removed at while updating the file later.
5//
6// Usage:
7//
8// eslint-ignore-errors app/assets/javascripts/something.js
9
10const fs = require('fs')
11const execFile = require('child_process').execFile
12
13execFile('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 // Produces {47: ['github/no-d-none', 'github/no-blur'], 83: ['github/no-blur']}
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
48function isDisableComment(line) {
49 return line.match(/\/\* eslint-disable-next-line .+\*\//)
50}