diff options
Diffstat (limited to 'arch/lightvim/.config/lightvim/lsp/biome.lua')
| -rw-r--r-- | arch/lightvim/.config/lightvim/lsp/biome.lua | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/arch/lightvim/.config/lightvim/lsp/biome.lua b/arch/lightvim/.config/lightvim/lsp/biome.lua new file mode 100644 index 0000000..89735af --- /dev/null +++ b/arch/lightvim/.config/lightvim/lsp/biome.lua @@ -0,0 +1,82 @@ +---@brief +--- https://biomejs.dev +--- +--- Toolchain of the web. [Successor of Rome](https://biomejs.dev/blog/annoucing-biome). +--- +--- ```sh +--- npm install [-g] @biomejs/biome +--- ``` +--- +--- ### Monorepo support +--- +--- `biome` supports monorepos by default. It will automatically find the `biome.json` corresponding to the package you are working on, as described in the [documentation](https://biomejs.dev/guides/big-projects/#monorepo). This works without the need of spawning multiple instances of `biome`, saving memory. + +local util = require 'lspconfig.util' + +---@type vim.lsp.Config +return { + cmd = function(dispatchers, config) + local cmd = 'biome' + if (config or {}).root_dir then + local local_cmd = vim.fs.joinpath(config.root_dir, 'node_modules/.bin', cmd) + if vim.fn.executable(local_cmd) == 1 then + cmd = local_cmd + end + end + return vim.lsp.rpc.start({ cmd, 'lsp-proxy' }, dispatchers) + end, + filetypes = { + 'astro', + 'css', + 'graphql', + 'html', + 'javascript', + 'javascriptreact', + 'json', + 'jsonc', + 'svelte', + 'typescript', + 'typescriptreact', + 'vue', + }, + workspace_required = true, + root_dir = function(bufnr, on_dir) + -- The project root is where the LSP can be started from + -- As stated in the documentation above, this LSP supports monorepos and simple projects. + -- We select then from the project root, which is identified by the presence of a package + -- manager lock file. + local root_markers = { + 'package-lock.json', + 'yarn.lock', + 'pnpm-lock.yaml', + 'bun.lockb', + 'bun.lock', + 'deno.lock', + } + -- Set a lower priority to avoid spawning multiple servers on monorepos + local biome_config_files = { 'biome.json', 'biome.jsonc' } + -- Give the root markers equal priority by wrapping them in a table + root_markers = vim.fn.has('nvim-0.11.3') == 1 and { root_markers, biome_config_files, { '.git' } } + or vim.list_extend(root_markers, vim.list_extend(biome_config_files, { '.git' })) + + -- We fallback to the current working directory if no project root is found + local project_root = vim.fs.root(bufnr, root_markers) or vim.fn.getcwd() + + -- We know that the buffer is using Biome if it has a config file + -- in its directory tree. + local filename = vim.api.nvim_buf_get_name(bufnr) + biome_config_files = util.insert_package_json(biome_config_files, 'biomejs', filename) + local is_buffer_using_biome = vim.fs.find(biome_config_files, { + path = filename, + type = 'file', + limit = 1, + upward = true, + stop = vim.fs.dirname(project_root), + })[1] + if not is_buffer_using_biome then + return + end + + on_dir(project_root) + end, +} |