-
Notifications
You must be signed in to change notification settings - Fork 1
/
fix.js
80 lines (68 loc) · 2.19 KB
/
fix.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
let cliEngine = new (require('eslint').CLIEngine)({fix: true})
let chokidar = require('chokidar')
let fs = require('fs')
let writingTo = {} // Paths we're currently writing fixed codez to
module.exports = (globsToWatch, options) => {
let startupTime = new Date().getTime()
let verbose = options.verbose
let fixOnStartup = options['fix-on-startup']
if (!globsToWatch || !globsToWatch.length) {
globsToWatch = ['./**/*.js']
}
if (!Array.isArray(globsToWatch)) {
globsToWatch = [globsToWatch]
}
if (verbose) {
console.error(`eslint-auto-fix is watching ${globsToWatch.join(', ')} for file changes`)
}
chokidar.watch(globsToWatch)
.on('change', fix(verbose))
.on('add', path => {
if (fixOnStartup) {
fix(verbose)(path)
} else {
// When chokidar first starts watching, it emits an "add" event for each file
// it finds matching the glob. Fixing them all at that point might be undesirable.
fs.stat(path, (error, stats) => {
if (stats && startupTime < stats.birthtimeMs) {
fix(verbose)(path)
}
})
}
})
}
let errorMessages = (fatalErrorResults, path) => {
fatalErrorResults.forEach(result => {
result.messages.forEach(({message, line, column}) => {
console.error(`${message} on line ${line}, column ${column} of ${path}`)
})
})
}
let fatalErrors = results => results.filter(
result => Boolean(result.messages.filter(
message => message.fatal
).length)
)
let fix = verbose => path => {
if (writingTo[path] === undefined) {
let results = cliEngine.executeOnFiles([path]).results
let fatalErrorResults = fatalErrors(results)
if (fatalErrorResults.length !== 0) {
errorMessages(fatalErrorResults, path)
} else if(results[0].output) { // Something needed fixin'
writeOutput(path, results[0].output, verbose)
}
}
}
let writeOutput = (path, output, verbose) => {
writingTo[path] = true
if (verbose) {
console.error(`ESLint is fixing ${path}`)
}
fs.writeFile(path, output, writeError => {
delete writingTo[path]
if (writeError) {
console.error(`Could not write to file ${path} to auto-fix it with ESLint.`)
}
})
}