Skip to content
Open
52 changes: 52 additions & 0 deletions lsp/oxfmt.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
--- @brief
---
--- https://github.com/oxc-project/oxc
--- https://oxc.rs/docs/guide/usage/formatter.html
---
--- `oxfmt` is a Prettier-compatible code formatter that supports multiple languages
--- including JavaScript, TypeScript, JSON, YAML, HTML, CSS, Markdown, and more.
--- It can be installed via `npm`:
---
--- ```sh
--- npm i -g oxfmt
--- ```

local util = require 'lspconfig.util'

---@type vim.lsp.Config
return {
cmd = { 'oxfmt', '--lsp' },
filetypes = {
'javascript',
'javascriptreact',
'javascript.jsx',
'typescript',
'typescriptreact',
'typescript.tsx',
'toml',
'json',
'jsonc',
'json5',
'yaml',
'html',
'vue',
'handlebars',
'hbs',
'css',
'scss',
'less',
'graphql',
'markdown',
'mdx',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this markdown.mdx? At least, my local Neovim v0.12.0-dev-1977+gdd6ed20272 shows it in the status bar.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mhh pretty sure it depends on configuration, with v0.11.5 vanilla I don't get any filetype on mdx files. Not sure about how to manage this case.

},
workspace_required = true,
root_dir = function(bufnr, on_dir)
local fname = vim.api.nvim_buf_get_name(bufnr)

-- Oxfmt resolves configuration by walking upward and using the nearest config file
-- to the file being processed. We therefore compute the root directory by locating
-- the closest `.oxfmtrc.json` (or `package.json` fallback) above the buffer.
local root_markers = util.insert_package_json({ '.oxfmtrc.json' }, 'oxfmt', fname)[1]
on_dir(vim.fs.dirname(vim.fs.find(root_markers, { path = fname, upward = true })[1]))
end,
}
37 changes: 34 additions & 3 deletions lsp/oxlint.lua
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
--- @brief
---
--- https://github.com/oxc-project/oxc
--- https://oxc.rs/docs/guide/usage/linter.html
---
--- `oxc` is a linter / formatter for JavaScript / Typescript supporting over 500 rules from ESLint and its popular plugins
--- `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
Expand All @@ -13,19 +15,48 @@ local util = require 'lspconfig.util'

---@type vim.lsp.Config
return {
cmd = { 'oxc_language_server' },
cmd = { 'oxlint', '--lsp' },
filetypes = {
'javascript',
'javascriptreact',
'javascript.jsx',
'typescript',
'typescriptreact',
'typescript.tsx',
'vue',
'svelte',
'astro',
},
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,
root_dir = function(bufnr, on_dir)
local fname = vim.api.nvim_buf_get_name(bufnr)
local root_markers = util.insert_package_json({ '.oxlintrc.json' }, 'oxlint', fname)

-- Oxlint resolves configuration by walking upward and using the nearest config file
-- to the file being processed. We therefore compute the root directory by locating
-- the closest `.oxlintrc.json` (or `package.json` fallback) above the buffer.
local root_markers = util.insert_package_json({ '.oxlintrc.json' }, 'oxlint', fname)[1]
on_dir(vim.fs.dirname(vim.fs.find(root_markers, { path = fname, upward = true })[1]))
end,
init_options = {
settings = {
-- ['run'] = 'onType',
-- ['configPath'] = nil,
-- ['tsConfigPath'] = nil,
-- ['unusedDisableDirectives'] = 'allow',
-- ['typeAware'] = false,
-- ['disableNestedConfig'] = false,
-- ['fixKind'] = 'safe_fix',
},
},
}