aboutsummaryrefslogtreecommitdiffstats
path: root/lsp/oxfmt.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lsp/oxfmt.lua')
-rw-r--r--lsp/oxfmt.lua55
1 files changed, 55 insertions, 0 deletions
diff --git a/lsp/oxfmt.lua b/lsp/oxfmt.lua
new file mode 100644
index 00000000..9e560b36
--- /dev/null
+++ b/lsp/oxfmt.lua
@@ -0,0 +1,55 @@
+--- @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 = function(dispatchers, config)
+ local cmd = 'oxfmt'
+ local local_cmd = (config or {}).root_dir and config.root_dir .. '/node_modules/.bin/oxfmt'
+ 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',
+ 'toml',
+ 'json',
+ 'jsonc',
+ 'json5',
+ 'yaml',
+ 'html',
+ 'vue',
+ 'handlebars',
+ 'css',
+ 'scss',
+ 'less',
+ 'graphql',
+ 'markdown',
+ },
+ 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` / `.oxfmtrc.jsonc` (or `package.json` fallback) above the buffer.
+ local root_markers = util.insert_package_json({ '.oxfmtrc.json', '.oxfmtrc.jsonc' }, 'oxfmt', fname)
+ on_dir(vim.fs.dirname(vim.fs.find(root_markers, { path = fname, upward = true })[1]))
+ end,
+}