From 6bfcb9cdffb86bf1a3e6d26cd1964858ff4bc3dd Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Wed, 8 Apr 2020 17:59:17 -0500 Subject: [PATCH 01/12] linters/xo: consolidate xo linters --- ale_linters/javascript/xo.vim | 23 ++------------- ale_linters/typescript/xo.vim | 23 ++------------- autoload/ale/handlers/xo.vim | 28 +++++++++++++++++++ .../test_xo_command_callback.vader | 10 ++++--- .../test_xots_command_callback.vader | 22 +++++++++++++++ 5 files changed, 62 insertions(+), 44 deletions(-) create mode 100644 autoload/ale/handlers/xo.vim create mode 100644 test/command_callback/test_xots_command_callback.vader diff --git a/ale_linters/javascript/xo.vim b/ale_linters/javascript/xo.vim index e24f4a82..5b206df8 100644 --- a/ale_linters/javascript/xo.vim +++ b/ale_linters/javascript/xo.vim @@ -1,26 +1,9 @@ " Author: Daniel Lupu " Description: xo for JavaScript files -call ale#Set('javascript_xo_executable', 'xo') -call ale#Set('javascript_xo_use_global', get(g:, 'ale_use_global_executables', 0)) -call ale#Set('javascript_xo_options', '') - -function! ale_linters#javascript#xo#GetExecutable(buffer) abort - return ale#node#FindExecutable(a:buffer, 'javascript_xo', [ - \ 'node_modules/.bin/xo', - \]) -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 json --stdin --stdin-filename %s' -endfunction - -" xo uses eslint and the output format is the same 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#HandleJSON', +\ 'executable': {b -> ale#handlers#xo#GetExecutable(b, 'javascript')}, +\ 'command': {b -> ale#handlers#xo#GetLintCommand(b, 'javascript')}, +\ 'callback': 'ale#handlers#xo#HandleJSON', \}) diff --git a/ale_linters/typescript/xo.vim b/ale_linters/typescript/xo.vim index 0a3a717b..13ae0cf7 100644 --- a/ale_linters/typescript/xo.vim +++ b/ale_linters/typescript/xo.vim @@ -1,23 +1,6 @@ -call ale#Set('typescript_xo_executable', 'xo') -call ale#Set('typescript_xo_use_global', get(g:, 'ale_use_global_executables', 0)) -call ale#Set('typescript_xo_options', '') - -function! ale_linters#typescript#xo#GetExecutable(buffer) abort - return ale#node#FindExecutable(a:buffer, 'typescript_xo', [ - \ 'node_modules/.bin/xo', - \]) -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 json --stdin --stdin-filename %s' -endfunction - -" xo uses eslint and the output format is the same 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#HandleJSON', +\ 'executable': {b -> ale#handlers#xo#GetExecutable(b, 'typescript')}, +\ 'command': {b -> ale#handlers#xo#GetLintCommand(b, 'typescript')}, +\ 'callback': 'ale#handlers#xo#HandleJSON', \}) diff --git a/autoload/ale/handlers/xo.vim b/autoload/ale/handlers/xo.vim new file mode 100644 index 00000000..38dcf5d5 --- /dev/null +++ b/autoload/ale/handlers/xo.vim @@ -0,0 +1,28 @@ +call ale#Set('javascript_xo_executable', 'xo') +call ale#Set('javascript_xo_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_xo_options', '') + +call ale#Set('typescript_xo_executable', 'xo') +call ale#Set('typescript_xo_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('typescript_xo_options', '') + +function! ale#handlers#xo#GetExecutable(buffer, type) abort + return ale#node#FindExecutable(a:buffer, a:type . '_xo', [ + \ 'node_modules/.bin/xo', + \]) +endfunction + +function! ale#handlers#xo#GetLintCommand(buffer, type) abort + return ale#Escape(ale#handlers#xo#GetExecutable(a:buffer, a:type)) + \ . ale#Pad(ale#handlers#xo#GetOptions(a:buffer, a:type)) + \ . ' --reporter json --stdin --stdin-filename %s' +endfunction + +function! ale#handlers#xo#GetOptions(buffer, type) abort + return ale#Var(a:buffer, a:type . '_xo_options') +endfunction + +" xo uses eslint and the output format is the same +function! ale#handlers#xo#HandleJSON(buffer, lines) abort + return ale#handlers#eslint#HandleJSON(a:buffer, a:lines) +endfunction diff --git a/test/command_callback/test_xo_command_callback.vader b/test/command_callback/test_xo_command_callback.vader index 65cb4f8a..7a38b2b1 100644 --- a/test/command_callback/test_xo_command_callback.vader +++ b/test/command_callback/test_xo_command_callback.vader @@ -1,8 +1,10 @@ Before: - call ale#assert#SetUpLinterTest('typescript', 'xo') - call ale#test#SetFilename('testfile.ts') + call ale#assert#SetUpLinterTest('javascript', 'xo') + call ale#test#SetFilename('testfile.js') unlet! b:executable + runtime autoload/ale/handlers/xo.vim + After: call ale#assert#TearDownLinterTest() @@ -10,11 +12,11 @@ Execute(The XO executable should be called): 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' + let b:ale_javascript_xo_executable = 'foobar' 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' + let b:ale_javascript_xo_options = '--wat' AssertLinter 'xo', ale#Escape('xo') . ' --wat --reporter json --stdin --stdin-filename %s' diff --git a/test/command_callback/test_xots_command_callback.vader b/test/command_callback/test_xots_command_callback.vader new file mode 100644 index 00000000..c614ad59 --- /dev/null +++ b/test/command_callback/test_xots_command_callback.vader @@ -0,0 +1,22 @@ +Before: + call ale#assert#SetUpLinterTest('typescript', 'xo') + call ale#test#SetFilename('testfile.ts') + unlet! b:executable + + runtime autoload/ale/handlers/xo.vim + +After: + call ale#assert#TearDownLinterTest() + +Execute(The XO executable should be called): + 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 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 json --stdin --stdin-filename %s' From 4a6136c27ec2430a1ef5481e0ca10dee03ba178f Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Wed, 8 Apr 2020 18:20:10 -0500 Subject: [PATCH 02/12] fixers/xo: add tests --- autoload/ale/fixers/xo.vim | 4 ++- .../react-app/node_modules/xo/cli.js | 0 test/fixers/test_xo_fixer_callback.vader | 29 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 test/eslint-test-files/react-app/node_modules/xo/cli.js create mode 100644 test/fixers/test_xo_fixer_callback.vader diff --git a/autoload/ale/fixers/xo.vim b/autoload/ale/fixers/xo.vim index 882350be..69d23ea3 100644 --- a/autoload/ale/fixers/xo.vim +++ b/autoload/ale/fixers/xo.vim @@ -14,10 +14,12 @@ endfunction function! ale#fixers#xo#Fix(buffer) abort let l:executable = ale#fixers#xo#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'javascript_xo_options') return { \ 'command': ale#node#Executable(a:buffer, l:executable) - \ . ' --fix %t', + \ . ' --fix %t' + \ . ale#Pad(l:options), \ 'read_temporary_file': 1, \} endfunction diff --git a/test/eslint-test-files/react-app/node_modules/xo/cli.js b/test/eslint-test-files/react-app/node_modules/xo/cli.js new file mode 100644 index 00000000..e69de29b diff --git a/test/fixers/test_xo_fixer_callback.vader b/test/fixers/test_xo_fixer_callback.vader new file mode 100644 index 00000000..8bccd05e --- /dev/null +++ b/test/fixers/test_xo_fixer_callback.vader @@ -0,0 +1,29 @@ +Before: + call ale#assert#SetUpFixerTest('javascript', 'xo') + +After: + call ale#assert#TearDownFixerTest() + +Execute(The xo callback should return the correct default values): + call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.js') + + AssertFixer + \ { + \ 'read_temporary_file': 1, + \ 'command': (has('win32') ? 'node.exe ' : '') + \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ' --fix %t', + \ } + +Execute(The xo callback should include custom xo options): + let g:ale_javascript_xo_options = '--space' + call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.js') + + AssertFixer + \ { + \ 'read_temporary_file': 1, + \ 'command': (has('win32') ? 'node.exe ' : '') + \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ' --fix %t' + \ . ' --space', + \ } From 289f808ccd3098cb19bc3bbbb274524a4fb85ff7 Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Wed, 8 Apr 2020 18:38:47 -0500 Subject: [PATCH 03/12] fixers/xo: refactor to handlers --- autoload/ale/fixers/xo.vim | 15 ++------------- autoload/ale/handlers/xo.vim | 1 + test/fixers/test_xo_fixer_callback.vader | 1 + 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/autoload/ale/fixers/xo.vim b/autoload/ale/fixers/xo.vim index 69d23ea3..06e58508 100644 --- a/autoload/ale/fixers/xo.vim +++ b/autoload/ale/fixers/xo.vim @@ -1,20 +1,9 @@ " Author: Albert Marquez - https://github.com/a-marquez " Description: Fixing files with XO. -call ale#Set('javascript_xo_executable', 'xo') -call ale#Set('javascript_xo_use_global', get(g:, 'ale_use_global_executables', 0)) -call ale#Set('javascript_xo_options', '') - -function! ale#fixers#xo#GetExecutable(buffer) abort - return ale#node#FindExecutable(a:buffer, 'javascript_xo', [ - \ 'node_modules/xo/cli.js', - \ 'node_modules/.bin/xo', - \]) -endfunction - function! ale#fixers#xo#Fix(buffer) abort - let l:executable = ale#fixers#xo#GetExecutable(a:buffer) - let l:options = ale#Var(a:buffer, 'javascript_xo_options') + let l:executable = ale#handlers#xo#GetExecutable(a:buffer, 'javascript') + let l:options = ale#handlers#xo#GetOptions(a:buffer, 'javascript') return { \ 'command': ale#node#Executable(a:buffer, l:executable) diff --git a/autoload/ale/handlers/xo.vim b/autoload/ale/handlers/xo.vim index 38dcf5d5..3f7c72cb 100644 --- a/autoload/ale/handlers/xo.vim +++ b/autoload/ale/handlers/xo.vim @@ -8,6 +8,7 @@ call ale#Set('typescript_xo_options', '') function! ale#handlers#xo#GetExecutable(buffer, type) abort return ale#node#FindExecutable(a:buffer, a:type . '_xo', [ + \ 'node_modules/xo/cli.js', \ 'node_modules/.bin/xo', \]) endfunction diff --git a/test/fixers/test_xo_fixer_callback.vader b/test/fixers/test_xo_fixer_callback.vader index 8bccd05e..0bb3108a 100644 --- a/test/fixers/test_xo_fixer_callback.vader +++ b/test/fixers/test_xo_fixer_callback.vader @@ -1,5 +1,6 @@ Before: call ale#assert#SetUpFixerTest('javascript', 'xo') + runtime autoload/ale/handlers/xo.vim After: call ale#assert#TearDownFixerTest() From e75ac9f4975be35e4f33b955f473ba5e336c9ca0 Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Wed, 8 Apr 2020 18:52:53 -0500 Subject: [PATCH 04/12] fixers/xo: support typescript options --- autoload/ale/fixers/xo.vim | 13 ++++++-- .../react-app/subdir/testfile.ts | 0 test/fixers/test_xo_fixer_callback.vader | 1 + test/fixers/test_xots_fixer_callback.vader | 31 +++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 test/eslint-test-files/react-app/subdir/testfile.ts create mode 100644 test/fixers/test_xots_fixer_callback.vader diff --git a/autoload/ale/fixers/xo.vim b/autoload/ale/fixers/xo.vim index 06e58508..6c2901db 100644 --- a/autoload/ale/fixers/xo.vim +++ b/autoload/ale/fixers/xo.vim @@ -2,8 +2,17 @@ " Description: Fixing files with XO. function! ale#fixers#xo#Fix(buffer) abort - let l:executable = ale#handlers#xo#GetExecutable(a:buffer, 'javascript') - let l:options = ale#handlers#xo#GetOptions(a:buffer, 'javascript') + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:type = '' + + if l:filetype =~# 'javascript' + let l:type = 'javascript' + elseif l:filetype =~# 'typescript' + let l:type = 'typescript' + endif + + let l:executable = ale#handlers#xo#GetExecutable(a:buffer, l:type) + let l:options = ale#handlers#xo#GetOptions(a:buffer, l:type) return { \ 'command': ale#node#Executable(a:buffer, l:executable) diff --git a/test/eslint-test-files/react-app/subdir/testfile.ts b/test/eslint-test-files/react-app/subdir/testfile.ts new file mode 100644 index 00000000..e69de29b diff --git a/test/fixers/test_xo_fixer_callback.vader b/test/fixers/test_xo_fixer_callback.vader index 0bb3108a..d36fe74c 100644 --- a/test/fixers/test_xo_fixer_callback.vader +++ b/test/fixers/test_xo_fixer_callback.vader @@ -1,6 +1,7 @@ Before: call ale#assert#SetUpFixerTest('javascript', 'xo') runtime autoload/ale/handlers/xo.vim + set filetype=javascript After: call ale#assert#TearDownFixerTest() diff --git a/test/fixers/test_xots_fixer_callback.vader b/test/fixers/test_xots_fixer_callback.vader new file mode 100644 index 00000000..1ef6a6dd --- /dev/null +++ b/test/fixers/test_xots_fixer_callback.vader @@ -0,0 +1,31 @@ +Before: + call ale#assert#SetUpFixerTest('typescript', 'xo') + runtime autoload/ale/handlers/xo.vim + set filetype=typescript + +After: + call ale#assert#TearDownFixerTest() + +Execute(The xo callback should return the correct default values): + call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.ts') + + AssertFixer + \ { + \ 'read_temporary_file': 1, + \ 'command': (has('win32') ? 'node.exe ' : '') + \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ' --fix %t', + \ } + +Execute(The xo callback should include custom xo options): + let g:ale_typescript_xo_options = '--space' + call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.ts') + + AssertFixer + \ { + \ 'read_temporary_file': 1, + \ 'command': (has('win32') ? 'node.exe ' : '') + \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ' --fix %t' + \ . ' --space', + \ } From 8ffde14039bdc0c12d1edf961461245eb15858e9 Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Wed, 8 Apr 2020 22:59:54 -0500 Subject: [PATCH 05/12] fixers/xo: support stdin relative to the fixed file --- autoload/ale/fixers/xo.vim | 29 ++++++++++++++++++++-- autoload/ale/handlers/xo.vim | 6 +++++ test/fixers/test_xo_fixer_callback.vader | 15 +++++++++++ test/fixers/test_xots_fixer_callback.vader | 15 +++++++++++ 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/autoload/ale/fixers/xo.vim b/autoload/ale/fixers/xo.vim index 6c2901db..2c8ab114 100644 --- a/autoload/ale/fixers/xo.vim +++ b/autoload/ale/fixers/xo.vim @@ -14,10 +14,35 @@ function! ale#fixers#xo#Fix(buffer) abort let l:executable = ale#handlers#xo#GetExecutable(a:buffer, l:type) let l:options = ale#handlers#xo#GetOptions(a:buffer, l:type) + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ l:executable, + \ '%e --version', + \ {b, v -> ale#fixers#xo#ApplyFixForVersion(b, v, l:executable, l:options)} + \) +endfunction + +function! ale#fixers#xo#ApplyFixForVersion(buffer, version, executable, options) abort + let l:executable = ale#node#Executable(a:buffer, a:executable) + let l:options = ale#Pad(a:options) + + " 0.30.0 is the first version with a working --stdin --fix + if ale#semver#GTE(a:version, [0, 30, 0]) + let l:project_root = ale#handlers#xo#GetProjectRoot(a:buffer) + + return { + \ 'command': ale#path#CdString(l:project_root) + \ . l:executable + \ . ' --stdin --stdin-filename %s' + \ . ' --fix' + \ . l:options, + \} + endif + return { - \ 'command': ale#node#Executable(a:buffer, l:executable) + \ 'command': l:executable \ . ' --fix %t' - \ . ale#Pad(l:options), + \ . l:options, \ 'read_temporary_file': 1, \} endfunction diff --git a/autoload/ale/handlers/xo.vim b/autoload/ale/handlers/xo.vim index 3f7c72cb..0bea74e4 100644 --- a/autoload/ale/handlers/xo.vim +++ b/autoload/ale/handlers/xo.vim @@ -27,3 +27,9 @@ endfunction function! ale#handlers#xo#HandleJSON(buffer, lines) abort return ale#handlers#eslint#HandleJSON(a:buffer, a:lines) endfunction + +function! ale#handlers#xo#GetProjectRoot(buffer) abort + let l:package_path = ale#path#FindNearestFile(a:buffer, 'package.json') + + return empty(l:package_path) ? '' : fnamemodify(l:package_path, ':p:h') +endfunction diff --git a/test/fixers/test_xo_fixer_callback.vader b/test/fixers/test_xo_fixer_callback.vader index d36fe74c..ffbecb6c 100644 --- a/test/fixers/test_xo_fixer_callback.vader +++ b/test/fixers/test_xo_fixer_callback.vader @@ -29,3 +29,18 @@ Execute(The xo callback should include custom xo options): \ . ' --fix %t' \ . ' --space', \ } + +Execute(--stdin should be used when xo is new enough): + let g:ale_javascript_xo_options = '--space' + call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.js') + + GivenCommandOutput ['0.30.0'] + AssertFixer + \ { + \ 'command': ale#path#CdString(ale#path#Simplify(g:dir . '/../eslint-test-files')) + \ . (has('win32') ? 'node.exe ' : '') + \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ' --stdin --stdin-filename %s' + \ . ' --fix' + \ . ' --space', + \ } diff --git a/test/fixers/test_xots_fixer_callback.vader b/test/fixers/test_xots_fixer_callback.vader index 1ef6a6dd..a26ec03c 100644 --- a/test/fixers/test_xots_fixer_callback.vader +++ b/test/fixers/test_xots_fixer_callback.vader @@ -29,3 +29,18 @@ Execute(The xo callback should include custom xo options): \ . ' --fix %t' \ . ' --space', \ } + +Execute(--stdin should be used when xo is new enough): + let g:ale_typescript_xo_options = '--space' + call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.ts') + + GivenCommandOutput ['0.30.0'] + AssertFixer + \ { + \ 'command': ale#path#CdString(ale#path#Simplify(g:dir . '/../eslint-test-files')) + \ . (has('win32') ? 'node.exe ' : '') + \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ' --stdin --stdin-filename %s' + \ . ' --fix' + \ . ' --space', + \ } From f17beadb49a6e57520303ea9a10722df1be4d13e Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Mon, 29 Jun 2020 18:40:43 -0500 Subject: [PATCH 06/12] fixers/xo: support monorepos --- autoload/ale/handlers/xo.vim | 4 ++-- test/fixers/test_xo_fixer_callback.vader | 14 +++++++------- test/fixers/test_xots_fixer_callback.vader | 14 +++++++------- test/xo-test-files/monorepo/node_modules/xo/cli.js | 0 test/xo-test-files/monorepo/package.json | 0 test/xo-test-files/monorepo/packages/a/index.js | 0 test/xo-test-files/monorepo/packages/a/index.ts | 0 .../xo-test-files/monorepo/packages/a/package.json | 0 8 files changed, 16 insertions(+), 16 deletions(-) create mode 100644 test/xo-test-files/monorepo/node_modules/xo/cli.js create mode 100644 test/xo-test-files/monorepo/package.json create mode 100644 test/xo-test-files/monorepo/packages/a/index.js create mode 100644 test/xo-test-files/monorepo/packages/a/index.ts create mode 100644 test/xo-test-files/monorepo/packages/a/package.json diff --git a/autoload/ale/handlers/xo.vim b/autoload/ale/handlers/xo.vim index 0bea74e4..df2659da 100644 --- a/autoload/ale/handlers/xo.vim +++ b/autoload/ale/handlers/xo.vim @@ -29,7 +29,7 @@ function! ale#handlers#xo#HandleJSON(buffer, lines) abort endfunction function! ale#handlers#xo#GetProjectRoot(buffer) abort - let l:package_path = ale#path#FindNearestFile(a:buffer, 'package.json') + let l:modules_dir = ale#path#FindNearestDirectory(a:buffer, 'node_modules') - return empty(l:package_path) ? '' : fnamemodify(l:package_path, ':p:h') + return empty(l:modules_dir) ? '' : fnamemodify(l:modules_dir, ':h:h') endfunction diff --git a/test/fixers/test_xo_fixer_callback.vader b/test/fixers/test_xo_fixer_callback.vader index ffbecb6c..c676bd34 100644 --- a/test/fixers/test_xo_fixer_callback.vader +++ b/test/fixers/test_xo_fixer_callback.vader @@ -7,39 +7,39 @@ After: call ale#assert#TearDownFixerTest() Execute(The xo callback should return the correct default values): - call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.js') + call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.js') AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': (has('win32') ? 'node.exe ' : '') - \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js')) \ . ' --fix %t', \ } Execute(The xo callback should include custom xo options): let g:ale_javascript_xo_options = '--space' - call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.js') + call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.js') AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': (has('win32') ? 'node.exe ' : '') - \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js')) \ . ' --fix %t' \ . ' --space', \ } Execute(--stdin should be used when xo is new enough): let g:ale_javascript_xo_options = '--space' - call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.js') + call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.js') GivenCommandOutput ['0.30.0'] AssertFixer \ { - \ 'command': ale#path#CdString(ale#path#Simplify(g:dir . '/../eslint-test-files')) + \ 'command': ale#path#CdString(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo')) \ . (has('win32') ? 'node.exe ' : '') - \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js')) \ . ' --stdin --stdin-filename %s' \ . ' --fix' \ . ' --space', diff --git a/test/fixers/test_xots_fixer_callback.vader b/test/fixers/test_xots_fixer_callback.vader index a26ec03c..6c8b448c 100644 --- a/test/fixers/test_xots_fixer_callback.vader +++ b/test/fixers/test_xots_fixer_callback.vader @@ -7,39 +7,39 @@ After: call ale#assert#TearDownFixerTest() Execute(The xo callback should return the correct default values): - call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.ts') + call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.ts') AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': (has('win32') ? 'node.exe ' : '') - \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js')) \ . ' --fix %t', \ } Execute(The xo callback should include custom xo options): let g:ale_typescript_xo_options = '--space' - call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.ts') + call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.ts') AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': (has('win32') ? 'node.exe ' : '') - \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js')) \ . ' --fix %t' \ . ' --space', \ } Execute(--stdin should be used when xo is new enough): let g:ale_typescript_xo_options = '--space' - call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.ts') + call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.ts') GivenCommandOutput ['0.30.0'] AssertFixer \ { - \ 'command': ale#path#CdString(ale#path#Simplify(g:dir . '/../eslint-test-files')) + \ 'command': ale#path#CdString(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo')) \ . (has('win32') ? 'node.exe ' : '') - \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/xo/cli.js')) + \ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js')) \ . ' --stdin --stdin-filename %s' \ . ' --fix' \ . ' --space', diff --git a/test/xo-test-files/monorepo/node_modules/xo/cli.js b/test/xo-test-files/monorepo/node_modules/xo/cli.js new file mode 100644 index 00000000..e69de29b diff --git a/test/xo-test-files/monorepo/package.json b/test/xo-test-files/monorepo/package.json new file mode 100644 index 00000000..e69de29b diff --git a/test/xo-test-files/monorepo/packages/a/index.js b/test/xo-test-files/monorepo/packages/a/index.js new file mode 100644 index 00000000..e69de29b diff --git a/test/xo-test-files/monorepo/packages/a/index.ts b/test/xo-test-files/monorepo/packages/a/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/test/xo-test-files/monorepo/packages/a/package.json b/test/xo-test-files/monorepo/packages/a/package.json new file mode 100644 index 00000000..e69de29b From 1991313ee734129d056a61d6daf1da2c738f8e1a Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Sat, 4 Jul 2020 14:11:16 -0500 Subject: [PATCH 07/12] xo: update docs --- doc/ale-typescript.txt | 27 +++++++++++++++++++++++++++ doc/ale.txt | 1 + 2 files changed, 28 insertions(+) diff --git a/doc/ale-typescript.txt b/doc/ale-typescript.txt index 2c50d119..026d17ce 100644 --- a/doc/ale-typescript.txt +++ b/doc/ale-typescript.txt @@ -138,5 +138,32 @@ g:ale_typescript_tsserver_use_global *g:ale_typescript_tsserver_use_global* tsserver in node_modules. +=============================================================================== +xo *ale-typescript-xo* + +g:ale_typescript_xo_executable *g:ale_typescript_xo_executable* + *b:ale_typescript_xo_executable* + Type: |String| + Default: `'xo'` + + See |ale-integrations-local-executables| + + +g:ale_typescript_xo_options *g:ale_typescript_xo_options* + *b:ale_typescript_xo_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to xo. + + +g:ale_typescript_xo_use_global *g:ale_typescript_xo_use_global* + *b:ale_typescript_xo_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + =============================================================================== vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/doc/ale.txt b/doc/ale.txt index cfb5beb4..817201c4 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -2997,6 +2997,7 @@ documented in additional help files. standard..............................|ale-typescript-standard| tslint................................|ale-typescript-tslint| tsserver..............................|ale-typescript-tsserver| + xo....................................|ale-typescript-xo| vala....................................|ale-vala-options| uncrustify............................|ale-vala-uncrustify| verilog/systemverilog...................|ale-verilog-options| From 23ff19a162aadb048f3d5b2d4a4aa9cf3ec58a52 Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Sat, 4 Jul 2020 14:12:14 -0500 Subject: [PATCH 08/12] fixers/xo: remove unnecessary directory crawl --- autoload/ale/fixers/xo.vim | 5 +---- autoload/ale/handlers/xo.vim | 6 ------ test/fixers/test_xo_fixer_callback.vader | 3 +-- test/fixers/test_xots_fixer_callback.vader | 3 +-- 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/autoload/ale/fixers/xo.vim b/autoload/ale/fixers/xo.vim index 2c8ab114..0f8f3ec6 100644 --- a/autoload/ale/fixers/xo.vim +++ b/autoload/ale/fixers/xo.vim @@ -28,11 +28,8 @@ function! ale#fixers#xo#ApplyFixForVersion(buffer, version, executable, options) " 0.30.0 is the first version with a working --stdin --fix if ale#semver#GTE(a:version, [0, 30, 0]) - let l:project_root = ale#handlers#xo#GetProjectRoot(a:buffer) - return { - \ 'command': ale#path#CdString(l:project_root) - \ . l:executable + \ 'command': l:executable \ . ' --stdin --stdin-filename %s' \ . ' --fix' \ . l:options, diff --git a/autoload/ale/handlers/xo.vim b/autoload/ale/handlers/xo.vim index df2659da..3f7c72cb 100644 --- a/autoload/ale/handlers/xo.vim +++ b/autoload/ale/handlers/xo.vim @@ -27,9 +27,3 @@ endfunction function! ale#handlers#xo#HandleJSON(buffer, lines) abort return ale#handlers#eslint#HandleJSON(a:buffer, a:lines) endfunction - -function! ale#handlers#xo#GetProjectRoot(buffer) abort - let l:modules_dir = ale#path#FindNearestDirectory(a:buffer, 'node_modules') - - return empty(l:modules_dir) ? '' : fnamemodify(l:modules_dir, ':h:h') -endfunction diff --git a/test/fixers/test_xo_fixer_callback.vader b/test/fixers/test_xo_fixer_callback.vader index c676bd34..a473606e 100644 --- a/test/fixers/test_xo_fixer_callback.vader +++ b/test/fixers/test_xo_fixer_callback.vader @@ -37,8 +37,7 @@ Execute(--stdin should be used when xo is new enough): GivenCommandOutput ['0.30.0'] AssertFixer \ { - \ 'command': ale#path#CdString(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo')) - \ . (has('win32') ? 'node.exe ' : '') + \ 'command': (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js')) \ . ' --stdin --stdin-filename %s' \ . ' --fix' diff --git a/test/fixers/test_xots_fixer_callback.vader b/test/fixers/test_xots_fixer_callback.vader index 6c8b448c..5c7fa1d1 100644 --- a/test/fixers/test_xots_fixer_callback.vader +++ b/test/fixers/test_xots_fixer_callback.vader @@ -37,8 +37,7 @@ Execute(--stdin should be used when xo is new enough): GivenCommandOutput ['0.30.0'] AssertFixer \ { - \ 'command': ale#path#CdString(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo')) - \ . (has('win32') ? 'node.exe ' : '') + \ 'command': (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js')) \ . ' --stdin --stdin-filename %s' \ . ' --fix' From 4edfac4db64debcfd33d894f169d0c1dc6dc48a4 Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Tue, 19 Jan 2021 22:16:10 -0600 Subject: [PATCH 09/12] xo: inline filetype handling --- ale_linters/javascript/xo.vim | 4 ++-- ale_linters/typescript/xo.vim | 4 ++-- autoload/ale/fixers/xo.vim | 13 ++----------- autoload/ale/handlers/xo.vim | 32 +++++++++++++++++++++++++------- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/ale_linters/javascript/xo.vim b/ale_linters/javascript/xo.vim index 5b206df8..9cc1dc69 100644 --- a/ale_linters/javascript/xo.vim +++ b/ale_linters/javascript/xo.vim @@ -3,7 +3,7 @@ call ale#linter#Define('javascript', { \ 'name': 'xo', -\ 'executable': {b -> ale#handlers#xo#GetExecutable(b, 'javascript')}, -\ 'command': {b -> ale#handlers#xo#GetLintCommand(b, 'javascript')}, +\ 'executable': {b -> ale#handlers#xo#GetExecutable(b)}, +\ 'command': {b -> ale#handlers#xo#GetLintCommand(b)}, \ 'callback': 'ale#handlers#xo#HandleJSON', \}) diff --git a/ale_linters/typescript/xo.vim b/ale_linters/typescript/xo.vim index 13ae0cf7..2e25ba4c 100644 --- a/ale_linters/typescript/xo.vim +++ b/ale_linters/typescript/xo.vim @@ -1,6 +1,6 @@ call ale#linter#Define('typescript', { \ 'name': 'xo', -\ 'executable': {b -> ale#handlers#xo#GetExecutable(b, 'typescript')}, -\ 'command': {b -> ale#handlers#xo#GetLintCommand(b, 'typescript')}, +\ 'executable': {b -> ale#handlers#xo#GetExecutable(b)}, +\ 'command': {b -> ale#handlers#xo#GetLintCommand(b)}, \ 'callback': 'ale#handlers#xo#HandleJSON', \}) diff --git a/autoload/ale/fixers/xo.vim b/autoload/ale/fixers/xo.vim index 0f8f3ec6..dcf4c737 100644 --- a/autoload/ale/fixers/xo.vim +++ b/autoload/ale/fixers/xo.vim @@ -2,17 +2,8 @@ " Description: Fixing files with XO. function! ale#fixers#xo#Fix(buffer) abort - let l:filetype = getbufvar(a:buffer, '&filetype') - let l:type = '' - - if l:filetype =~# 'javascript' - let l:type = 'javascript' - elseif l:filetype =~# 'typescript' - let l:type = 'typescript' - endif - - let l:executable = ale#handlers#xo#GetExecutable(a:buffer, l:type) - let l:options = ale#handlers#xo#GetOptions(a:buffer, l:type) + let l:executable = ale#handlers#xo#GetExecutable(a:buffer) + let l:options = ale#handlers#xo#GetOptions(a:buffer) return ale#semver#RunWithVersionCheck( \ a:buffer, diff --git a/autoload/ale/handlers/xo.vim b/autoload/ale/handlers/xo.vim index 3f7c72cb..2439b4f9 100644 --- a/autoload/ale/handlers/xo.vim +++ b/autoload/ale/handlers/xo.vim @@ -6,21 +6,39 @@ call ale#Set('typescript_xo_executable', 'xo') call ale#Set('typescript_xo_use_global', get(g:, 'ale_use_global_executables', 0)) call ale#Set('typescript_xo_options', '') -function! ale#handlers#xo#GetExecutable(buffer, type) abort - return ale#node#FindExecutable(a:buffer, a:type . '_xo', [ +function! ale#handlers#xo#GetExecutable(buffer) abort + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:type = '' + + if l:filetype =~# 'javascript' + let l:type = 'javascript' + elseif l:filetype =~# 'typescript' + let l:type = 'typescript' + endif + + return ale#node#FindExecutable(a:buffer, l:type . '_xo', [ \ 'node_modules/xo/cli.js', \ 'node_modules/.bin/xo', \]) endfunction -function! ale#handlers#xo#GetLintCommand(buffer, type) abort - return ale#Escape(ale#handlers#xo#GetExecutable(a:buffer, a:type)) - \ . ale#Pad(ale#handlers#xo#GetOptions(a:buffer, a:type)) +function! ale#handlers#xo#GetLintCommand(buffer) abort + return ale#Escape(ale#handlers#xo#GetExecutable(a:buffer)) + \ . ale#Pad(ale#handlers#xo#GetOptions(a:buffer)) \ . ' --reporter json --stdin --stdin-filename %s' endfunction -function! ale#handlers#xo#GetOptions(buffer, type) abort - return ale#Var(a:buffer, a:type . '_xo_options') +function! ale#handlers#xo#GetOptions(buffer) abort + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:type = '' + + if l:filetype =~# 'javascript' + let l:type = 'javascript' + elseif l:filetype =~# 'typescript' + let l:type = 'typescript' + endif + + return ale#Var(a:buffer, l:type . '_xo_options') endfunction " xo uses eslint and the output format is the same From 5fd5fa53051c3514917974d0ba57f18eb50dd37e Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Tue, 19 Jan 2021 23:08:10 -0600 Subject: [PATCH 10/12] linters/xo: fix tests --- test/command_callback/test_xo_command_callback.vader | 3 ++- test/command_callback/test_xots_command_callback.vader | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/test/command_callback/test_xo_command_callback.vader b/test/command_callback/test_xo_command_callback.vader index 7a38b2b1..1aa4c3f1 100644 --- a/test/command_callback/test_xo_command_callback.vader +++ b/test/command_callback/test_xo_command_callback.vader @@ -1,8 +1,9 @@ Before: call ale#assert#SetUpLinterTest('javascript', 'xo') - call ale#test#SetFilename('testfile.js') + call ale#test#SetFilename('testfile.jsx') unlet! b:executable + set filetype=javascriptreact runtime autoload/ale/handlers/xo.vim After: diff --git a/test/command_callback/test_xots_command_callback.vader b/test/command_callback/test_xots_command_callback.vader index c614ad59..cc38ff02 100644 --- a/test/command_callback/test_xots_command_callback.vader +++ b/test/command_callback/test_xots_command_callback.vader @@ -1,8 +1,9 @@ Before: call ale#assert#SetUpLinterTest('typescript', 'xo') - call ale#test#SetFilename('testfile.ts') + call ale#test#SetFilename('testfile.tsx') unlet! b:executable + set filetype=typescriptreact runtime autoload/ale/handlers/xo.vim After: From 03bd494fd42181f111ee56387a1d40639b42672e Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Tue, 19 Jan 2021 23:07:33 -0600 Subject: [PATCH 11/12] linters/xo: prefer function shorthand --- ale_linters/javascript/xo.vim | 4 ++-- ale_linters/typescript/xo.vim | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ale_linters/javascript/xo.vim b/ale_linters/javascript/xo.vim index 9cc1dc69..5e04ad5c 100644 --- a/ale_linters/javascript/xo.vim +++ b/ale_linters/javascript/xo.vim @@ -3,7 +3,7 @@ call ale#linter#Define('javascript', { \ 'name': 'xo', -\ 'executable': {b -> ale#handlers#xo#GetExecutable(b)}, -\ 'command': {b -> ale#handlers#xo#GetLintCommand(b)}, +\ 'executable': function('ale#handlers#xo#GetExecutable'), +\ 'command': function('ale#handlers#xo#GetLintCommand'), \ 'callback': 'ale#handlers#xo#HandleJSON', \}) diff --git a/ale_linters/typescript/xo.vim b/ale_linters/typescript/xo.vim index 2e25ba4c..6f4ee50c 100644 --- a/ale_linters/typescript/xo.vim +++ b/ale_linters/typescript/xo.vim @@ -1,6 +1,6 @@ call ale#linter#Define('typescript', { \ 'name': 'xo', -\ 'executable': {b -> ale#handlers#xo#GetExecutable(b)}, -\ 'command': {b -> ale#handlers#xo#GetLintCommand(b)}, +\ 'executable': function('ale#handlers#xo#GetExecutable'), +\ 'command': function('ale#handlers#xo#GetLintCommand'), \ 'callback': 'ale#handlers#xo#HandleJSON', \}) From 451e99341ea2abf48ec2e7318748e688a9a93b90 Mon Sep 17 00:00:00 2001 From: Charles B Johnson Date: Tue, 19 Jan 2021 23:07:55 -0600 Subject: [PATCH 12/12] xo: refactor to function --- autoload/ale/handlers/xo.vim | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/autoload/ale/handlers/xo.vim b/autoload/ale/handlers/xo.vim index 2439b4f9..c63278c0 100644 --- a/autoload/ale/handlers/xo.vim +++ b/autoload/ale/handlers/xo.vim @@ -7,14 +7,7 @@ call ale#Set('typescript_xo_use_global', get(g:, 'ale_use_global_executables', 0 call ale#Set('typescript_xo_options', '') function! ale#handlers#xo#GetExecutable(buffer) abort - let l:filetype = getbufvar(a:buffer, '&filetype') - let l:type = '' - - if l:filetype =~# 'javascript' - let l:type = 'javascript' - elseif l:filetype =~# 'typescript' - let l:type = 'typescript' - endif + let l:type = ale#handlers#xo#GetType(a:buffer) return ale#node#FindExecutable(a:buffer, l:type . '_xo', [ \ 'node_modules/xo/cli.js', @@ -29,14 +22,7 @@ function! ale#handlers#xo#GetLintCommand(buffer) abort endfunction function! ale#handlers#xo#GetOptions(buffer) abort - let l:filetype = getbufvar(a:buffer, '&filetype') - let l:type = '' - - if l:filetype =~# 'javascript' - let l:type = 'javascript' - elseif l:filetype =~# 'typescript' - let l:type = 'typescript' - endif + let l:type = ale#handlers#xo#GetType(a:buffer) return ale#Var(a:buffer, l:type . '_xo_options') endfunction @@ -45,3 +31,14 @@ endfunction function! ale#handlers#xo#HandleJSON(buffer, lines) abort return ale#handlers#eslint#HandleJSON(a:buffer, a:lines) endfunction + +function! ale#handlers#xo#GetType(buffer) abort + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:type = 'javascript' + + if l:filetype =~# 'typescript' + let l:type = 'typescript' + endif + + return l:type +endfunction