diff options
Diffstat (limited to '.config/nvim/lsp/biome.lua')
| -rw-r--r-- | .config/nvim/lsp/biome.lua | 72 | 
1 files changed, 72 insertions, 0 deletions
diff --git a/.config/nvim/lsp/biome.lua b/.config/nvim/lsp/biome.lua new file mode 100644 index 0000000..a134347 --- /dev/null +++ b/.config/nvim/lsp/biome.lua @@ -0,0 +1,72 @@ +---@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' +    local local_cmd = (config or {}).root_dir and config.root_dir .. '/node_modules/.bin/biome' +    if local_cmd and vim.fn.executable(local_cmd) == 1 then +      cmd = local_cmd +    end +    return vim.lsp.rpc.start({ cmd, 'lsp-proxy' }, dispatchers) +  end, +  filetypes = { +    'astro', +    'css', +    'graphql', +    'html', +    'javascript', +    'javascriptreact', +    'json', +    'jsonc', +    'svelte', +    'typescript', +    'typescript.tsx', +    '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' } +    -- 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, { '.git' } } +      or vim.list_extend(root_markers, { '.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) +    local biome_config_files = { 'biome.json', 'biome.jsonc' } +    biome_config_files = util.insert_package_json(biome_config_files, 'biome', 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, +}  |