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
82
83
84
85
|
--- @brief
---
--- https://github.com/oxc-project/oxc
--- https://oxc.rs/docs/guide/usage/linter.html
---
--- `oxlint` is a linter for JavaScript / TypeScript supporting over 500 rules from ESLint and its popular plugins.
--- It also supports linting framework files (Vue, Svelte, Astro) by analyzing their <script> blocks.
--- It can be installed via `npm`:
---
--- ```sh
--- npm i -g oxlint
--- ```
---
--- Type-aware linting will automatically be enabled if `tsgolint` exists in your
--- path and your `.oxlintrc.json` contains the string "typescript".
---
--- The default `on_attach` function provides an `:LspOxlintFixAll` command which
--- can be used to fix all fixable diagnostics. See the `eslint` config entry for
--- an example of how to use this to automatically fix all errors on write.
local function oxlint_conf_mentions_typescript(root_dir)
local fn = vim.fs.joinpath(root_dir, '.oxlintrc.json')
for line in io.lines(fn) do
if line:find('typescript') then
return true
end
end
return false
end
---@type vim.lsp.Config
return {
cmd = function(dispatchers, config)
local cmd = 'oxlint'
local local_cmd = (config or {}).root_dir and config.root_dir .. '/node_modules/.bin/oxlint'
if local_cmd and vim.fn.executable(local_cmd) == 1 then
cmd = local_cmd
end
return vim.lsp.rpc.start({ cmd, '--lsp' }, dispatchers)
end,
filetypes = {
'javascript',
'javascriptreact',
'typescript',
'typescriptreact',
'vue',
'svelte',
'astro',
},
root_markers = { '.oxlintrc.json', 'oxlint.config.ts' },
workspace_required = true,
on_attach = function(client, bufnr)
vim.api.nvim_buf_create_user_command(bufnr, 'LspOxlintFixAll', function()
client:exec_cmd({
title = 'Apply Oxlint automatic fixes',
command = 'oxc.fixAll',
arguments = { { uri = vim.uri_from_bufnr(bufnr) } },
})
end, {
desc = 'Apply Oxlint automatic fixes',
})
end,
settings = {
-- run = 'onType',
-- configPath = nil,
-- tsConfigPath = nil,
-- unusedDisableDirectives = 'allow',
-- typeAware = false,
-- disableNestedConfig = false,
-- fixKind = 'safe_fix',
},
before_init = function(init_params, config)
local settings = config.settings or {}
if settings.typeAware == nil and vim.fn.executable('tsgolint') == 1 then
local ok, res = pcall(oxlint_conf_mentions_typescript, config.root_dir)
if ok and res then
settings = vim.tbl_extend('force', settings, { typeAware = true })
end
end
local init_options = config.init_options or {}
init_options.settings = vim.tbl_extend('force', init_options.settings or {} --[[@as table]], settings)
init_params.initializationOptions = init_options
end,
}
|