Merge pull request #2551 from laino/eslint-json
Use JSON output for ESLint and fix tsserver column
This commit is contained in:
commit
5826b4927c
11 changed files with 489 additions and 48 deletions
|
@ -6,5 +6,5 @@ call ale#linter#Define('javascript', {
|
|||
\ 'output_stream': 'both',
|
||||
\ 'executable': function('ale#handlers#eslint#GetExecutable'),
|
||||
\ 'command': function('ale#handlers#eslint#GetCommand'),
|
||||
\ 'callback': 'ale#handlers#eslint#Handle',
|
||||
\ 'callback': 'ale#handlers#eslint#HandleJSON',
|
||||
\})
|
||||
|
|
|
@ -14,7 +14,7 @@ endfunction
|
|||
function! ale_linters#javascript#xo#GetCommand(buffer) abort
|
||||
return ale#Escape(ale_linters#javascript#xo#GetExecutable(a:buffer))
|
||||
\ . ' ' . ale#Var(a:buffer, 'javascript_xo_options')
|
||||
\ . ' --reporter unix --stdin --stdin-filename %s'
|
||||
\ . ' --reporter json --stdin --stdin-filename %s'
|
||||
endfunction
|
||||
|
||||
" xo uses eslint and the output format is the same
|
||||
|
@ -22,5 +22,5 @@ call ale#linter#Define('javascript', {
|
|||
\ 'name': 'xo',
|
||||
\ 'executable': function('ale_linters#javascript#xo#GetExecutable'),
|
||||
\ 'command': function('ale_linters#javascript#xo#GetCommand'),
|
||||
\ 'callback': 'ale#handlers#eslint#Handle',
|
||||
\ 'callback': 'ale#handlers#eslint#HandleJSON',
|
||||
\})
|
||||
|
|
|
@ -5,5 +5,5 @@ call ale#linter#Define('typescript', {
|
|||
\ 'name': 'eslint',
|
||||
\ 'executable': function('ale#handlers#eslint#GetExecutable'),
|
||||
\ 'command': function('ale#handlers#eslint#GetCommand'),
|
||||
\ 'callback': 'ale#handlers#eslint#Handle',
|
||||
\ 'callback': 'ale#handlers#eslint#HandleJSON',
|
||||
\})
|
||||
|
|
|
@ -11,7 +11,7 @@ endfunction
|
|||
function! ale_linters#typescript#xo#GetCommand(buffer) abort
|
||||
return ale#Escape(ale_linters#typescript#xo#GetExecutable(a:buffer))
|
||||
\ . ale#Pad(ale#Var(a:buffer, 'typescript_xo_options'))
|
||||
\ . ' --reporter unix --stdin --stdin-filename %s'
|
||||
\ . ' --reporter json --stdin --stdin-filename %s'
|
||||
endfunction
|
||||
|
||||
" xo uses eslint and the output format is the same
|
||||
|
@ -19,5 +19,5 @@ call ale#linter#Define('typescript', {
|
|||
\ 'name': 'xo',
|
||||
\ 'executable': function('ale_linters#typescript#xo#GetExecutable'),
|
||||
\ 'command': function('ale_linters#typescript#xo#GetCommand'),
|
||||
\ 'callback': 'ale#handlers#eslint#Handle',
|
||||
\ 'callback': 'ale#handlers#eslint#HandleJSON',
|
||||
\})
|
||||
|
|
|
@ -44,16 +44,9 @@ function! ale#handlers#eslint#GetCommand(buffer) abort
|
|||
|
||||
return ale#node#Executable(a:buffer, l:executable)
|
||||
\ . (!empty(l:options) ? ' ' . l:options : '')
|
||||
\ . ' -f unix --stdin --stdin-filename %s'
|
||||
\ . ' -f json --stdin --stdin-filename %s'
|
||||
endfunction
|
||||
|
||||
let s:col_end_patterns = [
|
||||
\ '\vParsing error: Unexpected token (.+) ?',
|
||||
\ '\v''(.+)'' is not defined.',
|
||||
\ '\v%(Unexpected|Redundant use of) [''`](.+)[''`]',
|
||||
\ '\vUnexpected (console) statement',
|
||||
\]
|
||||
|
||||
function! s:AddHintsForTypeScriptParsingErrors(output) abort
|
||||
for l:item in a:output
|
||||
let l:item.text = substitute(
|
||||
|
@ -90,22 +83,71 @@ function! s:CheckForBadConfig(buffer, lines) abort
|
|||
return 0
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#eslint#Handle(buffer, lines) abort
|
||||
if s:CheckForBadConfig(a:buffer, a:lines)
|
||||
return [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(a:lines, "\n"),
|
||||
\}]
|
||||
function! s:parseJSON(buffer, lines) abort
|
||||
try
|
||||
let l:parsed = json_decode(a:lines[-1])
|
||||
catch
|
||||
return []
|
||||
endtry
|
||||
|
||||
if type(l:parsed) != v:t_list || empty(l:parsed)
|
||||
return []
|
||||
endif
|
||||
|
||||
if a:lines == ['Could not connect']
|
||||
return [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'Could not connect to eslint_d. Try updating eslint_d or killing it.',
|
||||
\}]
|
||||
let l:errors = l:parsed[0]['messages']
|
||||
|
||||
if empty(l:errors)
|
||||
return []
|
||||
endif
|
||||
|
||||
let l:output = []
|
||||
|
||||
for l:error in l:errors
|
||||
let l:obj = ({
|
||||
\ 'lnum': get(l:error, 'line', 0),
|
||||
\ 'text': get(l:error, 'message', ''),
|
||||
\ 'type': 'E',
|
||||
\})
|
||||
|
||||
if get(l:error, 'severity', 0) is# 1
|
||||
let l:obj.type = 'W'
|
||||
endif
|
||||
|
||||
if has_key(l:error, 'ruleId')
|
||||
let l:code = l:error['ruleId']
|
||||
|
||||
" Sometimes ESLint returns null here
|
||||
if !empty(l:code)
|
||||
let l:obj.code = l:code
|
||||
endif
|
||||
endif
|
||||
|
||||
if has_key(l:error, 'column')
|
||||
let l:obj.col = l:error['column']
|
||||
endif
|
||||
|
||||
if has_key(l:error, 'endColumn')
|
||||
let l:obj.end_col = l:error['endColumn'] - 1
|
||||
endif
|
||||
|
||||
if has_key(l:error, 'endLine')
|
||||
let l:obj.end_lnum = l:error['endLine']
|
||||
endif
|
||||
|
||||
call add(l:output, l:obj)
|
||||
endfor
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
let s:col_end_patterns = [
|
||||
\ '\vParsing error: Unexpected token (.+) ?',
|
||||
\ '\v''(.+)'' is not defined.',
|
||||
\ '\v%(Unexpected|Redundant use of) [''`](.+)[''`]',
|
||||
\ '\vUnexpected (console) statement',
|
||||
\]
|
||||
|
||||
function! s:parseLines(buffer, lines) abort
|
||||
" Matches patterns line the following:
|
||||
"
|
||||
" /path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]
|
||||
|
@ -120,12 +162,6 @@ function! ale#handlers#eslint#Handle(buffer, lines) abort
|
|||
for l:match in ale#util#GetMatches(a:lines, [l:pattern, l:parsing_pattern])
|
||||
let l:text = l:match[3]
|
||||
|
||||
if ale#Var(a:buffer, 'javascript_eslint_suppress_eslintignore')
|
||||
if l:text =~# '^File ignored'
|
||||
continue
|
||||
endif
|
||||
endif
|
||||
|
||||
let l:obj = {
|
||||
\ 'lnum': l:match[1] + 0,
|
||||
\ 'col': l:match[2] + 0,
|
||||
|
@ -143,11 +179,6 @@ function! ale#handlers#eslint#Handle(buffer, lines) abort
|
|||
" The code can be something like 'Error/foo/bar', or just 'Error'
|
||||
if !empty(get(l:split_code, 1))
|
||||
let l:obj.code = join(l:split_code[1:], '/')
|
||||
|
||||
if l:obj.code is# 'no-trailing-spaces'
|
||||
\&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace')
|
||||
continue
|
||||
endif
|
||||
endif
|
||||
|
||||
for l:col_match in ale#util#GetMatches(l:text, s:col_end_patterns)
|
||||
|
@ -157,9 +188,59 @@ function! ale#handlers#eslint#Handle(buffer, lines) abort
|
|||
call add(l:output, l:obj)
|
||||
endfor
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
function! s:FilterResult(buffer, obj) abort
|
||||
if ale#Var(a:buffer, 'javascript_eslint_suppress_eslintignore')
|
||||
if a:obj.text =~# '^File ignored'
|
||||
return 0
|
||||
endif
|
||||
endif
|
||||
|
||||
if has_key(a:obj, 'code') && a:obj.code is# 'no-trailing-spaces'
|
||||
\&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace')
|
||||
return 0
|
||||
endif
|
||||
|
||||
return 1
|
||||
endfunction
|
||||
|
||||
function! s:HandleESLintOutput(buffer, lines, type) abort
|
||||
if s:CheckForBadConfig(a:buffer, a:lines)
|
||||
return [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(a:lines, "\n"),
|
||||
\}]
|
||||
endif
|
||||
|
||||
if a:lines == ['Could not connect']
|
||||
return [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'Could not connect to eslint_d. Try updating eslint_d or killing it.',
|
||||
\}]
|
||||
endif
|
||||
|
||||
if a:type is# 'json'
|
||||
let l:output = s:parseJSON(a:buffer, a:lines)
|
||||
else
|
||||
let l:output = s:parseLines(a:buffer, a:lines)
|
||||
endif
|
||||
|
||||
call filter(l:output, {idx, obj -> s:FilterResult(a:buffer, obj)})
|
||||
|
||||
if expand('#' . a:buffer . ':t') =~? '\.tsx\?$'
|
||||
call s:AddHintsForTypeScriptParsingErrors(l:output)
|
||||
endif
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#eslint#HandleJSON(buffer, lines) abort
|
||||
return s:HandleESLintOutput(a:buffer, a:lines, 'json')
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#eslint#Handle(buffer, lines) abort
|
||||
return s:HandleESLintOutput(a:buffer, a:lines, 'lines')
|
||||
endfunction
|
||||
|
|
|
@ -90,7 +90,7 @@ function! ale#lsp#response#ReadTSServerDiagnostics(response) abort
|
|||
\ 'lnum': l:diagnostic.start.line,
|
||||
\ 'col': l:diagnostic.start.offset,
|
||||
\ 'end_lnum': l:diagnostic.end.line,
|
||||
\ 'end_col': l:diagnostic.end.offset,
|
||||
\ 'end_col': l:diagnostic.end.offset - 1,
|
||||
\}
|
||||
|
||||
if has_key(l:diagnostic, 'code')
|
||||
|
|
|
@ -7,14 +7,14 @@ After:
|
|||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The XO executable should be called):
|
||||
AssertLinter 'xo', ale#Escape('xo') . ' --reporter unix --stdin --stdin-filename %s'
|
||||
AssertLinter 'xo', ale#Escape('xo') . ' --reporter json --stdin --stdin-filename %s'
|
||||
|
||||
Execute(The XO executable should be configurable):
|
||||
let b:ale_typescript_xo_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', ale#Escape('foobar') . ' --reporter unix --stdin --stdin-filename %s'
|
||||
AssertLinter 'foobar', ale#Escape('foobar') . ' --reporter json --stdin --stdin-filename %s'
|
||||
|
||||
Execute(The XO options should be configurable):
|
||||
let b:ale_typescript_xo_options = '--wat'
|
||||
|
||||
AssertLinter 'xo', ale#Escape('xo') . ' --wat --reporter unix --stdin --stdin-filename %s'
|
||||
AssertLinter 'xo', ale#Escape('xo') . ' --wat --reporter json --stdin --stdin-filename %s'
|
||||
|
|
360
test/handler/test_eslint_json_handler.vader
Normal file
360
test/handler/test_eslint_json_handler.vader
Normal file
|
@ -0,0 +1,360 @@
|
|||
Before:
|
||||
Save g:ale_javascript_eslint_suppress_eslintignore
|
||||
Save g:ale_javascript_eslint_suppress_missing_config
|
||||
Save g:ale_warn_about_trailing_whitespace
|
||||
Save g:ale_warn_about_trailing_blank_lines
|
||||
|
||||
let g:ale_javascript_eslint_suppress_eslintignore = 0
|
||||
let g:ale_javascript_eslint_suppress_missing_config = 0
|
||||
let g:ale_warn_about_trailing_whitespace = 1
|
||||
let g:ale_warn_about_trailing_blank_lines = 1
|
||||
unlet! b:ale_warn_about_trailing_whitespace
|
||||
unlet! b:ale_warn_about_trailing_blank_lines
|
||||
|
||||
After:
|
||||
Restore
|
||||
|
||||
unlet! b:ale_javascript_eslint_suppress_eslintignore
|
||||
unlet! b:ale_javascript_eslint_suppress_missing_config
|
||||
unlet! b:ale_warn_about_trailing_whitespace
|
||||
unlet! b:ale_warn_about_trailing_blank_lines
|
||||
unlet! g:config_error_lines
|
||||
|
||||
Execute(The eslint handler should parse json correctly):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 1,
|
||||
\ 'end_lnum': 1,
|
||||
\ 'col': 7,
|
||||
\ 'end_col': 14,
|
||||
\ 'text': '''variable'' is assigned a value but never used.',
|
||||
\ 'code': 'no-unused-vars',
|
||||
\ 'type': 'W',
|
||||
\ },
|
||||
\ {
|
||||
\ 'lnum': 5,
|
||||
\ 'col': 15,
|
||||
\ 'text': 'Missing semicolon.',
|
||||
\ 'code': 'semi',
|
||||
\ 'type': 'W',
|
||||
\ },
|
||||
\ {
|
||||
\ 'lnum': 7,
|
||||
\ 'end_lnum': 7,
|
||||
\ 'col': 7,
|
||||
\ 'end_col': 14,
|
||||
\ 'text': '''variable'' is already defined.',
|
||||
\ 'code': 'no-redeclare',
|
||||
\ 'type': 'E',
|
||||
\ },
|
||||
\ ],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"foo.js","messages":[{"ruleId":"no-unused-vars","severity":1,"message":"''variable'' is assigned a value but never used.","line":1,"column":7,"nodeType":"Identifier","endLine":1,"endColumn":15},{"ruleId":"semi","severity":1,"message":"Missing semicolon.","line":5,"column":15,"nodeType":"ExpressionStatement","fix":{"range":[46,46],"text":";"}},{"ruleId":"no-redeclare","severity":2,"message":"''variable'' is already defined.","line":7,"column":7,"nodeType":"Identifier","endLine":7,"endColumn":15}],"errorCount":1,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":1,"source":"const variable = {\n a: 3\n};\n\nconsole.log(1)\n\nclass variable {\n}\n"}]'
|
||||
\ ])
|
||||
|
||||
Execute(The eslint handler should print a message about a missing configuration file):
|
||||
let g:config_error_lines = [
|
||||
\ '',
|
||||
\ 'Oops! Something went wrong! :(',
|
||||
\ '',
|
||||
\ 'ESLint couldn''t find a configuration file. To set up a configuration file for this project, please run:',
|
||||
\ ' eslint --init',
|
||||
\ '',
|
||||
\ 'ESLint looked for configuration files in /some/path/or/other and its ancestors.',
|
||||
\ '',
|
||||
\ 'If you think you already have a configuration file or if you need more help, please stop by the ESLint chat room: https://gitter.im/eslint/eslint',
|
||||
\ '',
|
||||
\ ]
|
||||
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(g:config_error_lines, "\n"),
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), g:config_error_lines[:])
|
||||
|
||||
Execute(The eslint handler should allow the missing config error to be suppressed):
|
||||
let b:ale_javascript_eslint_suppress_missing_config = 1
|
||||
let g:config_error_lines = [
|
||||
\ '',
|
||||
\ 'Oops! Something went wrong! :(',
|
||||
\ '',
|
||||
\ 'ESLint couldn''t find a configuration file. To set up a configuration file for this project, please run:',
|
||||
\ ' eslint --init',
|
||||
\ '',
|
||||
\ 'ESLint looked for configuration files in /some/path/or/other and its ancestors.',
|
||||
\ '',
|
||||
\ 'If you think you already have a configuration file or if you need more help, please stop by the ESLint chat room: https://gitter.im/eslint/eslint',
|
||||
\ '',
|
||||
\ ]
|
||||
|
||||
AssertEqual
|
||||
\ [],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), g:config_error_lines[:])
|
||||
|
||||
Execute(The eslint handler should print a message for config parsing errors):
|
||||
let g:config_error_lines = [
|
||||
\ 'Cannot read config file: /some/path/or/other/.eslintrc.js',
|
||||
\ 'Error: Unexpected token <<',
|
||||
\ '/some/path/or/other/.eslintrc.js:1',
|
||||
\ '(function (exports, require, module, __filename, __dirname) { <<<>>>',
|
||||
\ ' ^^',
|
||||
\ 'SyntaxError: Unexpected token <<',
|
||||
\ ' at Object.exports.runInThisContext (vm.js:76:16)',
|
||||
\ ' at Module._compile (module.js:528:28)',
|
||||
\ ' at Object.Module._extensions..js (module.js:565:10)',
|
||||
\ ' at Module.load (module.js:473:32)',
|
||||
\ ' at tryModuleLoad (module.js:432:12)',
|
||||
\ ' at Function.Module._load (module.js:424:3)',
|
||||
\ ' at Module.require (module.js:483:17)',
|
||||
\ ' at require (internal/module.js:20:19)',
|
||||
\ ' at module.exports (/usr/local/lib/node_modules/eslint/node_modules/require-uncached/index.js:14:12)',
|
||||
\ ' at loadJSConfigFile (/usr/local/lib/node_modules/eslint/lib/config/config-file.js:160:16)',
|
||||
\]
|
||||
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(g:config_error_lines, "\n"),
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), g:config_error_lines[:])
|
||||
|
||||
Execute(Suppressing missing configs shouldn't suppress parsing errors):
|
||||
let b:ale_javascript_eslint_suppress_missing_config = 1
|
||||
let g:config_error_lines = [
|
||||
\ 'Cannot read config file: /some/path/or/other/.eslintrc.js',
|
||||
\ 'Error: Unexpected token <<',
|
||||
\ '/some/path/or/other/.eslintrc.js:1',
|
||||
\ '(function (exports, require, module, __filename, __dirname) { <<<>>>',
|
||||
\ ' ^^',
|
||||
\ 'SyntaxError: Unexpected token <<',
|
||||
\ ' at Object.exports.runInThisContext (vm.js:76:16)',
|
||||
\ ' at Module._compile (module.js:528:28)',
|
||||
\ ' at Object.Module._extensions..js (module.js:565:10)',
|
||||
\ ' at Module.load (module.js:473:32)',
|
||||
\ ' at tryModuleLoad (module.js:432:12)',
|
||||
\ ' at Function.Module._load (module.js:424:3)',
|
||||
\ ' at Module.require (module.js:483:17)',
|
||||
\ ' at require (internal/module.js:20:19)',
|
||||
\ ' at module.exports (/usr/local/lib/node_modules/eslint/node_modules/require-uncached/index.js:14:12)',
|
||||
\ ' at loadJSConfigFile (/usr/local/lib/node_modules/eslint/lib/config/config-file.js:160:16)',
|
||||
\]
|
||||
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(g:config_error_lines, "\n"),
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), g:config_error_lines[:])
|
||||
|
||||
Execute(The eslint handler should print a message for invalid configuration settings):
|
||||
let g:config_error_lines = [
|
||||
\ '/home/w0rp/git/wazoku/wazoku-spotlight/.eslintrc.js:',
|
||||
\ ' Configuration for rule "indent" is invalid:',
|
||||
\ ' Value "off" is the wrong type.',
|
||||
\ '',
|
||||
\ 'Error: /home/w0rp/git/wazoku/wazoku-spotlight/.eslintrc.js:',
|
||||
\ ' Configuration for rule "indent" is invalid:',
|
||||
\ ' Value "off" is the wrong type.',
|
||||
\ '',
|
||||
\ ' at validateRuleOptions (/usr/local/lib/node_modules/eslint/lib/config/config-validator.js:115:15)',
|
||||
\ ' at /usr/local/lib/node_modules/eslint/lib/config/config-validator.js:162:13',
|
||||
\ ' at Array.forEach (native)',
|
||||
\ ' at Object.validate (/usr/local/lib/node_modules/eslint/lib/config/config-validator.js:161:35)',
|
||||
\ ' at Object.load (/usr/local/lib/node_modules/eslint/lib/config/config-file.js:522:19)',
|
||||
\ ' at loadConfig (/usr/local/lib/node_modules/eslint/lib/config.js:63:33)',
|
||||
\ ' at getLocalConfig (/usr/local/lib/node_modules/eslint/lib/config.js:130:29)',
|
||||
\ ' at Config.getConfig (/usr/local/lib/node_modules/eslint/lib/config.js:256:22)',
|
||||
\ ' at processText (/usr/local/lib/node_modules/eslint/lib/cli-engine.js:224:33)',
|
||||
\ ' at CLIEngine.executeOnText (/usr/local/lib/node_modules/eslint/lib/cli-engine.js:756:26)',
|
||||
\]
|
||||
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(g:config_error_lines, "\n"),
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), g:config_error_lines[:])
|
||||
|
||||
Execute(Suppressing missing configs shouldn't suppress invalid config errors):
|
||||
let b:ale_javascript_eslint_suppress_missing_config = 1
|
||||
let g:config_error_lines = [
|
||||
\ '/home/w0rp/git/wazoku/wazoku-spotlight/.eslintrc.js:',
|
||||
\ ' Configuration for rule "indent" is invalid:',
|
||||
\ ' Value "off" is the wrong type.',
|
||||
\ '',
|
||||
\ 'Error: /home/w0rp/git/wazoku/wazoku-spotlight/.eslintrc.js:',
|
||||
\ ' Configuration for rule "indent" is invalid:',
|
||||
\ ' Value "off" is the wrong type.',
|
||||
\ '',
|
||||
\ ' at validateRuleOptions (/usr/local/lib/node_modules/eslint/lib/config/config-validator.js:115:15)',
|
||||
\ ' at /usr/local/lib/node_modules/eslint/lib/config/config-validator.js:162:13',
|
||||
\ ' at Array.forEach (native)',
|
||||
\ ' at Object.validate (/usr/local/lib/node_modules/eslint/lib/config/config-validator.js:161:35)',
|
||||
\ ' at Object.load (/usr/local/lib/node_modules/eslint/lib/config/config-file.js:522:19)',
|
||||
\ ' at loadConfig (/usr/local/lib/node_modules/eslint/lib/config.js:63:33)',
|
||||
\ ' at getLocalConfig (/usr/local/lib/node_modules/eslint/lib/config.js:130:29)',
|
||||
\ ' at Config.getConfig (/usr/local/lib/node_modules/eslint/lib/config.js:256:22)',
|
||||
\ ' at processText (/usr/local/lib/node_modules/eslint/lib/cli-engine.js:224:33)',
|
||||
\ ' at CLIEngine.executeOnText (/usr/local/lib/node_modules/eslint/lib/cli-engine.js:756:26)',
|
||||
\]
|
||||
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(g:config_error_lines, "\n"),
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), g:config_error_lines[:])
|
||||
|
||||
Execute(The eslint handler should print a message when import is not used in a module):
|
||||
let g:config_error_lines = [
|
||||
\ 'ImportDeclaration should appear when the mode is ES6 and in the module context.',
|
||||
\ 'AssertionError: ImportDeclaration should appear when the mode is ES6 and in the module context.',
|
||||
\ ' at Referencer.ImportDeclaration (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint-scope/lib/referencer.js:597:9)',
|
||||
\ ' at Referencer.Visitor.visit (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/esrecurse/esrecurse.js:122:34)',
|
||||
\ ' at Referencer.Visitor.visitChildren (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/esrecurse/esrecurse.js:101:38)',
|
||||
\ ' at Referencer.Program (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint-scope/lib/referencer.js:449:14)',
|
||||
\ ' at Referencer.Visitor.visit (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/esrecurse/esrecurse.js:122:34)',
|
||||
\ ' at Object.analyze (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint-scope/lib/index.js:138:16)',
|
||||
\ ' at EventEmitter.module.exports.api.verify (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint/lib/eslint.js:887:40)',
|
||||
\ ' at processText (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint/lib/cli-engine.js:278:31)',
|
||||
\ ' at CLIEngine.executeOnText (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint/lib/cli-engine.js:734:26)',
|
||||
\ ' at Object.execute (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint/lib/cli.js:171:42) ',
|
||||
\]
|
||||
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(g:config_error_lines, "\n"),
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), g:config_error_lines[:])
|
||||
|
||||
Execute(Suppressing missing configs shouldn't suppress module import errors):
|
||||
let b:ale_javascript_eslint_suppress_missing_config = 1
|
||||
let g:config_error_lines = [
|
||||
\ 'ImportDeclaration should appear when the mode is ES6 and in the module context.',
|
||||
\ 'AssertionError: ImportDeclaration should appear when the mode is ES6 and in the module context.',
|
||||
\ ' at Referencer.ImportDeclaration (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint-scope/lib/referencer.js:597:9)',
|
||||
\ ' at Referencer.Visitor.visit (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/esrecurse/esrecurse.js:122:34)',
|
||||
\ ' at Referencer.Visitor.visitChildren (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/esrecurse/esrecurse.js:101:38)',
|
||||
\ ' at Referencer.Program (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint-scope/lib/referencer.js:449:14)',
|
||||
\ ' at Referencer.Visitor.visit (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/esrecurse/esrecurse.js:122:34)',
|
||||
\ ' at Object.analyze (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint-scope/lib/index.js:138:16)',
|
||||
\ ' at EventEmitter.module.exports.api.verify (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint/lib/eslint.js:887:40)',
|
||||
\ ' at processText (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint/lib/cli-engine.js:278:31)',
|
||||
\ ' at CLIEngine.executeOnText (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint/lib/cli-engine.js:734:26)',
|
||||
\ ' at Object.execute (/home/w0rp/git/wazoku/wazoku-spotlight/spotlight/static/node_modules/eslint/lib/cli.js:171:42) ',
|
||||
\]
|
||||
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(g:config_error_lines, "\n"),
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), g:config_error_lines[:])
|
||||
|
||||
Execute(The eslint handler should hint about using typescript-eslint-parser):
|
||||
silent! noautocmd file foo.ts
|
||||
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 2,
|
||||
\ 'col': 1,
|
||||
\ 'text': 'Parsing error (You may need configure typescript-eslint-parser): The keyword ''interface'' is reserved',
|
||||
\ 'type': 'E',
|
||||
\ },
|
||||
\ ],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"foo.ts","messages":[{"ruleId":null,"fatal":true,"severity":2,"message":"Parsing error: The keyword ''interface'' is reserved","line":2,"column":1}],"errorCount":1,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"\ninterface test {}\n"}]',
|
||||
\ ])
|
||||
|
||||
Execute(eslint should warn about ignored files by default):
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 0,
|
||||
\ 'type': 'W',
|
||||
\ 'text': 'File ignored because of a matching ignore pattern. Use "--no-ignore" to override.'
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"/path/to/some/ignored/file.js","messages":[{"fatal":false,"severity":1,"message":"File ignored because of a matching ignore pattern. Use \"--no-ignore\" to override."}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0}]',
|
||||
\ ])
|
||||
|
||||
AssertEqual
|
||||
\ [{
|
||||
\ 'lnum': 0,
|
||||
\ 'type': 'W',
|
||||
\ 'text': 'File ignored by default. Use "--ignore-pattern ''!node_modules/*''" to override.',
|
||||
\ }],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"/path/to/some/ignored/file.js","messages":[{"fatal":false,"severity":1,"message":"File ignored by default. Use \"--ignore-pattern ''!node_modules/*''\" to override."}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0}]',
|
||||
\ ])
|
||||
|
||||
Execute(eslint should not warn about ignored files when explicitly disabled):
|
||||
let g:ale_javascript_eslint_suppress_eslintignore = 1
|
||||
|
||||
AssertEqual
|
||||
\ [],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"/path/to/some/ignored/file.js","messages":[{"fatal":false,"severity":1,"message":"File ignored because of a matching ignore pattern. Use \"--no-ignore\" to override."}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0}]',
|
||||
\ ])
|
||||
|
||||
AssertEqual
|
||||
\ [],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"/path/to/some/ignored/file.js","messages":[{"fatal":false,"severity":1,"message":"File ignored by default. Use \"--ignore-pattern ''!node_modules/*''\" to override."}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0}]',
|
||||
\ ])
|
||||
|
||||
Execute(Failing to connect to eslint_d should be handled correctly):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'Could not connect to eslint_d. Try updating eslint_d or killing it.',
|
||||
\ },
|
||||
\ ],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ 'Could not connect',
|
||||
\ ])
|
||||
|
||||
Execute(Disabling warnings about trailing spaces should work):
|
||||
silent! noautocmd file foo.ts
|
||||
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 2,
|
||||
\ 'col': 16,
|
||||
\ 'code': 'no-trailing-spaces',
|
||||
\ 'type': 'W',
|
||||
\ 'text': 'Trailing spaces not allowed.',
|
||||
\ },
|
||||
\ ],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"foo.js","messages":[{"ruleId":"no-trailing-spaces","severity":1,"message":"Trailing spaces not allowed.","line":2,"column":16,"nodeType":"Program","fix":{"range":[16,17],"text":""}}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":1,"source":"\nconsole.log(1); \n"}]'
|
||||
\ ])
|
||||
|
||||
let g:ale_warn_about_trailing_whitespace = 0
|
||||
|
||||
AssertEqual
|
||||
\ [],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"foo.js","messages":[{"ruleId":"no-trailing-spaces","severity":1,"message":"Trailing spaces not allowed.","line":2,"column":16,"nodeType":"Program","fix":{"range":[16,17],"text":""}}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":1,"source":"\nconsole.log(1); \n"}]'
|
||||
\ ])
|
||||
|
||||
let g:ale_warn_about_trailing_whitespace = 1
|
||||
let b:ale_warn_about_trailing_whitespace = 0
|
||||
|
||||
AssertEqual
|
||||
\ [],
|
||||
\ ale#handlers#eslint#HandleJSON(bufnr(''), [
|
||||
\ '[{"filePath":"foo.js","messages":[{"ruleId":"no-trailing-spaces","severity":1,"message":"Trailing spaces not allowed.","line":2,"column":16,"nodeType":"Program","fix":{"range":[16,17],"text":""}}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":1,"source":"\nconsole.log(1); \n"}]'
|
||||
\ ])
|
|
@ -219,7 +219,7 @@ Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle tsserver respon
|
|||
\ 'lnum': 1,
|
||||
\ 'col': 11,
|
||||
\ 'end_lnum': 1,
|
||||
\ 'end_col': 17,
|
||||
\ 'end_col': 16,
|
||||
\ },
|
||||
\ ],
|
||||
\ ale#lsp#response#ReadTSServerDiagnostics({"seq":0,"type":"event","event":"semanticDiag","body":{"file":"/bar/foo.ts","diagnostics":[{"start":{"line":1,"offset":11},"end":{"line":1,"offset":17},"text":"Operator ''+'' cannot be applied to types ''3'' and ''{}''.","code":2365}]}})
|
||||
|
@ -234,7 +234,7 @@ Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle warnings from t
|
|||
\ 'code': '2515',
|
||||
\ 'end_lnum': 27,
|
||||
\ 'type': 'W',
|
||||
\ 'end_col': 14,
|
||||
\ 'end_col': 13,
|
||||
\ 'text': 'Calls to ''console.log'' are not allowed. (no-console)',
|
||||
\ }
|
||||
\ ],
|
||||
|
@ -250,7 +250,7 @@ Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle suggestions fro
|
|||
\ 'code': '2515',
|
||||
\ 'end_lnum': 27,
|
||||
\ 'type': 'I',
|
||||
\ 'end_col': 14,
|
||||
\ 'end_col': 13,
|
||||
\ 'text': 'Some info',
|
||||
\ }
|
||||
\ ],
|
||||
|
|
|
@ -59,11 +59,11 @@ Execute(eslint.js executables should be run with node on Windows):
|
|||
AssertEqual
|
||||
\ ale#Escape('node.exe') . ' '
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/eslint-test-files/react-app/node_modules/eslint/bin/eslint.js'))
|
||||
\ . ' -f unix --stdin --stdin-filename %s',
|
||||
\ . ' -f json --stdin --stdin-filename %s',
|
||||
\ ale#handlers#eslint#GetCommand(bufnr(''))
|
||||
else
|
||||
AssertEqual
|
||||
\ ale#Escape(ale#path#Simplify(g:dir . '/eslint-test-files/react-app/node_modules/eslint/bin/eslint.js'))
|
||||
\ . ' -f unix --stdin --stdin-filename %s',
|
||||
\ . ' -f json --stdin --stdin-filename %s',
|
||||
\ ale#handlers#eslint#GetCommand(bufnr(''))
|
||||
endif
|
||||
|
|
|
@ -249,7 +249,7 @@ Execute(Buffer ignore lists should be applied for tsserver):
|
|||
\ 'nr': 1005,
|
||||
\ 'code': '1005',
|
||||
\ 'type': 'E',
|
||||
\ 'end_col': 15,
|
||||
\ 'end_col': 14,
|
||||
\ 'end_lnum': 2,
|
||||
\ 'text': ''','' expected.',
|
||||
\ },
|
||||
|
@ -344,7 +344,7 @@ Execute(ale_disable_lsp should be applied for tsserver):
|
|||
\ 'nr': 1005,
|
||||
\ 'code': '1005',
|
||||
\ 'type': 'E',
|
||||
\ 'end_col': 15,
|
||||
\ 'end_col': 14,
|
||||
\ 'end_lnum': 2,
|
||||
\ 'text': ''','' expected.',
|
||||
\ },
|
||||
|
|
Reference in a new issue