-
Notifications
You must be signed in to change notification settings - Fork 2
/
javascriptlint.js
81 lines (70 loc) · 2.2 KB
/
javascriptlint.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
81
/**
* javascriptlint wrapper for nodejs
*
* @author David Trejo aka DTrejo
*/
var fs = require('fs'),
join = require('path').join,
spawn = require('child_process').spawn,
root = join(__dirname, '..', '..');
/**
* Run javascriptlint
* @param {String} file path to file.
* @param {Object} options linter options.
* @param {Function} callback callback function.
* @export
*/
module.exports = function(file, options, callback) {
var linter,
errors = [],
name,
opts;
opts = [
'-process', file,
'-nologo'
];
// convert options to opts. this may not act like other linters. oops?
for (name in options) {
if (options[name]) {
opts.push('-' + name);
if (typeof options[name] !== 'boolean') {
opts.push(options[name]);
}
}
}
linter = spawn(root + '/deps/javascriptlint/jsl', opts);
linter.stdout.on('data', function(data) {
data = data.toString().split(file);
data.forEach(function(str, i) {
if (i === 0) {
// of form `jsl-test.js\n`
// filename = str.replace('\n', '');
return;
}
if (i === data.length - 1) {
// of form
// `(22): lint warning: undeclared identifier:
// z\n\n0 error(s), 11 warning(s)\n`
// gotta remove the ending.
str = str.substring(0, str.indexOf('\n\n') + 5);
return;
}
var line = /(\d+)/.exec(str)[0],
msg;
// handle both cases. This matters b/c a warning
// is more severe than a lint warning.
// (9): warning: test for equality (==) mistyped as assignmen ...
// (23): lint warning: missing default case in ...
msg = str.substring(str.indexOf(':') + 2, str.length);
errors.push({
linter: 'javascriptlint',
file: file,
message: msg || 'no message found',
line: line || 'no line found'
});
});
});
linter.on('exit', function(code) {
callback(errors);
});
};