aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-07-06 19:41:43 +0200
committerWilliam Boman <william@redwill.se>2022-07-07 00:39:59 +0200
commit5f634e0c37e723fc0c33e06b4fd5c2180178db40 (patch)
treefa4f09363adefa8259e23e4d1ea036db628b1243 /lua
parentfeat(health): use stderr for java version, also check for JAVA_HOME (#765) (diff)
downloadmason-5f634e0c37e723fc0c33e06b4fd5c2180178db40.tar
mason-5f634e0c37e723fc0c33e06b4fd5c2180178db40.tar.gz
mason-5f634e0c37e723fc0c33e06b4fd5c2180178db40.tar.bz2
mason-5f634e0c37e723fc0c33e06b4fd5c2180178db40.tar.lz
mason-5f634e0c37e723fc0c33e06b4fd5c2180178db40.tar.xz
mason-5f634e0c37e723fc0c33e06b4fd5c2180178db40.tar.zst
mason-5f634e0c37e723fc0c33e06b4fd5c2180178db40.zip
mason.nvim
Diffstat (limited to 'lua')
-rw-r--r--lua/mason-lspconfig/init.lua139
-rw-r--r--lua/mason-lspconfig/server-mapping.lua130
-rw-r--r--lua/mason-lspconfig/server_configurations/angularls/init.lua41
-rw-r--r--lua/mason-lspconfig/server_configurations/apex_ls/init.lua8
-rw-r--r--lua/mason-lspconfig/server_configurations/bicep/init.lua8
-rw-r--r--lua/mason-lspconfig/server_configurations/bsl_ls/init.lua12
-rw-r--r--lua/mason-lspconfig/server_configurations/elixirls/init.lua15
-rw-r--r--lua/mason-lspconfig/server_configurations/esbonio/init.lua6
-rw-r--r--lua/mason-lspconfig/server_configurations/groovyls/init.lua8
-rw-r--r--lua/mason-lspconfig/server_configurations/haxe_language_server/init.lua8
-rw-r--r--lua/mason-lspconfig/server_configurations/jdtls/README.md33
-rw-r--r--lua/mason-lspconfig/server_configurations/jdtls/init.lua78
-rw-r--r--lua/mason-lspconfig/server_configurations/julials/README.md (renamed from lua/nvim-lsp-installer/servers/julials/README.md)0
-rw-r--r--lua/mason-lspconfig/server_configurations/julials/init.lua50
-rw-r--r--lua/mason-lspconfig/server_configurations/omnisharp/README.md (renamed from lua/nvim-lsp-installer/servers/omnisharp/README.md)0
-rw-r--r--lua/mason-lspconfig/server_configurations/omnisharp/init.lua32
-rw-r--r--lua/mason-lspconfig/server_configurations/perlnavigator/init.lua12
-rw-r--r--lua/mason-lspconfig/server_configurations/powershell_es/init.lua6
-rw-r--r--lua/mason-lspconfig/server_configurations/pylsp/README.md (renamed from lua/nvim-lsp-installer/servers/pylsp/README.md)0
-rw-r--r--lua/mason-lspconfig/server_configurations/pylsp/init.lua51
-rw-r--r--lua/mason-lspconfig/server_configurations/r_language_server/init.lua8
-rw-r--r--lua/mason-lspconfig/server_configurations/rescriptls/init.lua8
-rw-r--r--lua/mason-lspconfig/server_configurations/solang/init.lua14
-rw-r--r--lua/mason-lspconfig/server_configurations/tflint/README.md (renamed from lua/nvim-lsp-installer/servers/tflint/README.md)0
-rw-r--r--lua/mason-lspconfig/server_configurations/visualforce_ls/init.lua21
-rw-r--r--lua/mason-lspconfig/server_configurations/volar/init.lua29
-rw-r--r--lua/mason-lspconfig/settings.lua27
-rw-r--r--lua/mason.lua30
-rw-r--r--lua/mason/_generated/lsp-schemas/astro-language-server.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/astro.lua)2
-rw-r--r--lua/mason/_generated/lsp-schemas/bash-language-server.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/bashls.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/clangd.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/clangd.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/deno-lsp.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/denols.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/elixir-ls.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/elixirls.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/elm-language-server.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/elmls.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/fsautocomplete.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/grammarly-languageserver.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/grammarly.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/haxe-language-server.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/html-lsp.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/intelephense.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/intelephense.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/jdtls.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/json-lsp.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/jsonls.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/julia-lsp.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/kotlin-language-server.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/kotlin_language_server.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/ltex-ls.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/ltex.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/lua-language-server.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/nickel-lang-lsp.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/nickel_ls.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/omnisharp-roslyn.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/perlnavigator.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/psalm.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/psalm.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/puppet-editor-services.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/puppet.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/purescript-language-server.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/purescriptls.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/pyright.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/pyright.lua)2
-rw-r--r--lua/mason/_generated/lsp-schemas/python-lsp-server.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/r-languageserver.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/r_language_server.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/rescript-lsp.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/rome.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/rome.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/rust-analyzer.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/solargraph.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/solargraph.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/sorbet.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/sorbet.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/stylelint-lsp.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/stylelint_lsp.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/svelte-language-server.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/tailwindcss-language-server.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/typescript-language-server.lua3
-rw-r--r--lua/mason/_generated/lsp-schemas/vetur-vls.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/vuels.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/vue-language-server.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/volar.lua)2
-rw-r--r--lua/mason/_generated/lsp-schemas/yaml-language-server.lua (renamed from lua/nvim-lsp-installer/_generated/schemas/yamlls.lua)0
-rw-r--r--lua/mason/_generated/lsp-schemas/zls.lua3
-rw-r--r--lua/mason/_generated/lspconfig_filetype_map.lua (renamed from lua/nvim-lsp-installer/_generated/filetype_map.lua)15
-rw-r--r--lua/mason/_generated/package_index.lua131
-rw-r--r--lua/mason/command-api/init.lua81
-rw-r--r--lua/mason/core/EventEmitter.lua64
-rw-r--r--lua/mason/core/async/control.lua75
-rw-r--r--lua/mason/core/async/init.lua (renamed from lua/nvim-lsp-installer/core/async/init.lua)37
-rw-r--r--lua/mason/core/async/uv.lua (renamed from lua/nvim-lsp-installer/core/async/uv.lua)2
-rw-r--r--lua/mason/core/clients/eclipse.lua (renamed from lua/nvim-lsp-installer/core/clients/eclipse.lua)2
-rw-r--r--lua/mason/core/fetch.lua122
-rw-r--r--lua/mason/core/fs.lua (renamed from lua/nvim-lsp-installer/core/fs.lua)19
-rw-r--r--lua/mason/core/functional/data.lua (renamed from lua/nvim-lsp-installer/core/functional/data.lua)0
-rw-r--r--lua/mason/core/functional/function.lua (renamed from lua/nvim-lsp-installer/core/functional/function.lua)2
-rw-r--r--lua/mason/core/functional/init.lua (renamed from lua/nvim-lsp-installer/core/functional/init.lua)32
-rw-r--r--lua/mason/core/functional/list.lua (renamed from lua/nvim-lsp-installer/core/functional/list.lua)66
-rw-r--r--lua/mason/core/functional/logic.lua (renamed from lua/nvim-lsp-installer/core/functional/logic.lua)24
-rw-r--r--lua/mason/core/functional/number.lua (renamed from lua/nvim-lsp-installer/core/functional/number.lua)2
-rw-r--r--lua/mason/core/functional/relation.lua (renamed from lua/nvim-lsp-installer/core/functional/relation.lua)2
-rw-r--r--lua/mason/core/functional/string.lua68
-rw-r--r--lua/mason/core/functional/table.lua45
-rw-r--r--lua/mason/core/functional/type.lua (renamed from lua/nvim-lsp-installer/core/functional/type.lua)4
-rw-r--r--lua/mason/core/installer/context.lua262
-rw-r--r--lua/mason/core/installer/handle.lua214
-rw-r--r--lua/mason/core/installer/init.lua176
-rw-r--r--lua/mason/core/installer/linker.lua84
-rw-r--r--lua/mason/core/managers/cargo/client.lua (renamed from lua/nvim-lsp-installer/core/managers/cargo/client.lua)2
-rw-r--r--lua/mason/core/managers/cargo/init.lua (renamed from lua/nvim-lsp-installer/core/managers/cargo/init.lua)32
-rw-r--r--lua/mason/core/managers/composer/init.lua (renamed from lua/nvim-lsp-installer/core/managers/composer/init.lua)29
-rw-r--r--lua/mason/core/managers/dotnet/init.lua (renamed from lua/nvim-lsp-installer/core/managers/dotnet/init.lua)25
-rw-r--r--lua/mason/core/managers/gem/init.lua (renamed from lua/nvim-lsp-installer/core/managers/gem/init.lua)29
-rw-r--r--lua/mason/core/managers/git/init.lua (renamed from lua/nvim-lsp-installer/core/managers/git/init.lua)11
-rw-r--r--lua/mason/core/managers/github/client.lua (renamed from lua/nvim-lsp-installer/core/managers/github/client.lua)24
-rw-r--r--lua/mason/core/managers/github/init.lua (renamed from lua/nvim-lsp-installer/core/managers/github/init.lua)53
-rw-r--r--lua/mason/core/managers/go/init.lua (renamed from lua/nvim-lsp-installer/core/managers/go/init.lua)25
-rw-r--r--lua/mason/core/managers/luarocks/init.lua (renamed from lua/nvim-lsp-installer/core/managers/luarocks/init.lua)19
-rw-r--r--lua/mason/core/managers/npm/init.lua (renamed from lua/nvim-lsp-installer/core/managers/npm/init.lua)33
-rw-r--r--lua/mason/core/managers/opam/init.lua (renamed from lua/nvim-lsp-installer/core/managers/opam/init.lua)25
-rw-r--r--lua/mason/core/managers/pip3/init.lua (renamed from lua/nvim-lsp-installer/core/managers/pip3/init.lua)33
-rw-r--r--lua/mason/core/managers/powershell/init.lua (renamed from lua/nvim-lsp-installer/core/managers/powershell/init.lua)12
-rw-r--r--lua/mason/core/managers/std/init.lua (renamed from lua/nvim-lsp-installer/core/managers/std/init.lua)19
-rw-r--r--lua/mason/core/optional.lua (renamed from lua/nvim-lsp-installer/core/optional.lua)0
-rw-r--r--lua/mason/core/package/indexer.lua89
-rw-r--r--lua/mason/core/package/init.lua205
-rw-r--r--lua/mason/core/package/version-check.lua89
-rw-r--r--lua/mason/core/path.lua (renamed from lua/nvim-lsp-installer/core/path.lua)27
-rw-r--r--lua/mason/core/platform.lua (renamed from lua/nvim-lsp-installer/core/platform.lua)17
-rw-r--r--lua/mason/core/process.lua (renamed from lua/nvim-lsp-installer/core/process.lua)145
-rw-r--r--lua/mason/core/receipt.lua (renamed from lua/nvim-lsp-installer/core/receipt.lua)26
-rw-r--r--lua/mason/core/result.lua (renamed from lua/nvim-lsp-installer/core/result.lua)0
-rw-r--r--lua/mason/core/spawn.lua (renamed from lua/nvim-lsp-installer/core/spawn.lua)55
-rw-r--r--lua/mason/core/ui/display.lua (renamed from lua/nvim-lsp-installer/core/ui/display.lua)109
-rw-r--r--lua/mason/core/ui/init.lua (renamed from lua/nvim-lsp-installer/core/ui/init.lua)68
-rw-r--r--lua/mason/core/ui/state.lua (renamed from lua/nvim-lsp-installer/core/ui/state.lua)0
-rw-r--r--lua/mason/health/init.lua (renamed from lua/nvim-lsp-installer/health/init.lua)93
-rw-r--r--lua/mason/log.lua (renamed from lua/nvim-lsp-installer/log.lua)35
-rw-r--r--lua/mason/notify.lua (renamed from lua/nvim-lsp-installer/notify.lua)2
-rw-r--r--lua/mason/packages/angular-language-server/init.lua11
-rw-r--r--lua/mason/packages/ansible-language-server/init.lua11
-rw-r--r--lua/mason/packages/apex-language-server/init.lua38
-rw-r--r--lua/mason/packages/arduino-language-server/init.lua44
-rw-r--r--lua/mason/packages/asm-lsp/init.lua13
-rw-r--r--lua/mason/packages/astro-language-server/init.lua11
-rw-r--r--lua/mason/packages/awk-language-server/init.lua11
-rw-r--r--lua/mason/packages/bash-language-server/init.lua11
-rw-r--r--lua/mason/packages/beancount-language-server/init.lua13
-rw-r--r--lua/mason/packages/bicep-lsp/init.lua29
-rw-r--r--lua/mason/packages/bsl-language-server/init.lua21
-rw-r--r--lua/mason/packages/ccls/common.lua (renamed from lua/nvim-lsp-installer/servers/ccls/common.lua)20
-rw-r--r--lua/mason/packages/ccls/init.lua17
-rw-r--r--lua/mason/packages/ccls/linux.lua (renamed from lua/nvim-lsp-installer/servers/ccls/linux.lua)18
-rw-r--r--lua/mason/packages/ccls/mac.lua (renamed from lua/nvim-lsp-installer/servers/ccls/mac.lua)10
-rw-r--r--lua/mason/packages/clangd/init.lua40
-rw-r--r--lua/mason/packages/clarity-lsp/init.lua27
-rw-r--r--lua/mason/packages/clojure-lsp/init.lua31
-rw-r--r--lua/mason/packages/cmake-language-server/init.lua11
-rw-r--r--lua/mason/packages/codelldb/init.lua32
-rw-r--r--lua/mason/packages/codeql/init.lua28
-rw-r--r--lua/mason/packages/cpptools/init.lua40
-rw-r--r--lua/mason/packages/crystalline/init.lua29
-rw-r--r--lua/mason/packages/csharp-language-server/init.lua11
-rw-r--r--lua/mason/packages/css-lsp/init.lua11
-rw-r--r--lua/mason/packages/cssmodules-language-server/init.lua11
-rw-r--r--lua/mason/packages/cucumber-language-server/init.lua11
-rw-r--r--lua/mason/packages/debugpy/init.lua11
-rw-r--r--lua/mason/packages/deno/init.lua28
-rw-r--r--lua/mason/packages/dhall-lsp/init.lua67
-rw-r--r--lua/mason/packages/diagnostic-languageserver/init.lua11
-rw-r--r--lua/mason/packages/dockerfile-language-server/init.lua11
-rw-r--r--lua/mason/packages/dot-language-server/init.lua11
-rw-r--r--lua/mason/packages/efm/init.lua11
-rw-r--r--lua/mason/packages/elixir-ls/init.lua19
-rw-r--r--lua/mason/packages/elm-format/init.lua11
-rw-r--r--lua/mason/packages/elm-language-server/init.lua11
-rw-r--r--lua/mason/packages/ember-language-server/init.lua11
-rw-r--r--lua/mason/packages/emmet-ls/init.lua11
-rw-r--r--lua/mason/packages/erlang-ls/init.lua34
-rw-r--r--lua/mason/packages/esbonio/init.lua11
-rw-r--r--lua/mason/packages/eslint-lsp/init.lua11
-rw-r--r--lua/mason/packages/flux-lsp/init.lua14
-rw-r--r--lua/mason/packages/foam-language-server/init.lua11
-rw-r--r--lua/mason/packages/fortls/init.lua11
-rw-r--r--lua/mason/packages/fsautocomplete/init.lua13
-rw-r--r--lua/mason/packages/golangci-lint-langserver/init.lua11
-rw-r--r--lua/mason/packages/golangci-lint/init.lua11
-rw-r--r--lua/mason/packages/gopls/init.lua11
-rw-r--r--lua/mason/packages/grammarly-languageserver/init.lua11
-rw-r--r--lua/mason/packages/graphql-language-service-cli/init.lua11
-rw-r--r--lua/mason/packages/groovy-language-server/init.lua22
-rw-r--r--lua/mason/packages/haskell-language-server/init.lua65
-rw-r--r--lua/mason/packages/haxe-language-server/init.lua25
-rw-r--r--lua/mason/packages/hoon-language-server/init.lua11
-rw-r--r--lua/mason/packages/html-lsp/init.lua11
-rw-r--r--lua/mason/packages/intelephense/init.lua11
-rw-r--r--lua/mason/packages/jdtls/init.lua44
-rw-r--r--lua/mason/packages/jedi-language-server/init.lua11
-rw-r--r--lua/mason/packages/json-lsp/init.lua11
-rw-r--r--lua/mason/packages/jsonnet-language-server/init.lua11
-rw-r--r--lua/mason/packages/julia-lsp/init.lua57
-rw-r--r--lua/mason/packages/kotlin-language-server/init.lua28
-rw-r--r--lua/mason/packages/lelwel/init.lua14
-rw-r--r--lua/mason/packages/lemminx/init.lua41
-rw-r--r--lua/mason/packages/lemmy-help/init.lua14
-rw-r--r--lua/mason/packages/ltex-ls/init.lua72
-rw-r--r--lua/mason/packages/lua-language-server/init.lua60
-rw-r--r--lua/mason/packages/marksman/init.lua30
-rw-r--r--lua/mason/packages/metamath-zero-lsp/init.lua24
-rw-r--r--lua/mason/packages/mockdebug/init.lua23
-rw-r--r--lua/mason/packages/nickel-lang-lsp/init.lua15
-rw-r--r--lua/mason/packages/nimlsp/init.lua22
-rw-r--r--lua/mason/packages/ocaml-lsp/init.lua11
-rw-r--r--lua/mason/packages/omnisharp-roslyn/init.lua41
-rw-r--r--lua/mason/packages/opencl-language-server/init.lua40
-rw-r--r--lua/mason/packages/perlnavigator/init.lua11
-rw-r--r--lua/mason/packages/phpactor/init.lua25
-rw-r--r--lua/mason/packages/powershell-editor-services/init.lua19
-rw-r--r--lua/mason/packages/prisma-language-server/init.lua11
-rw-r--r--lua/mason/packages/prosemd-lsp/init.lua30
-rw-r--r--lua/mason/packages/psalm/init.lua20
-rw-r--r--lua/mason/packages/puppet-editor-services/init.lua24
-rw-r--r--lua/mason/packages/purescript-language-server/init.lua11
-rw-r--r--lua/mason/packages/pyright/init.lua11
-rw-r--r--lua/mason/packages/python-lsp-server/init.lua11
-rw-r--r--lua/mason/packages/quick-lint-js/init.lua50
-rw-r--r--lua/mason/packages/r-languageserver/init.lua (renamed from lua/nvim-lsp-installer/servers/r_language_server/init.lua)62
-rw-r--r--lua/mason/packages/reason-language-server/init.lua36
-rw-r--r--lua/mason/packages/remark-language-server/init.lua11
-rw-r--r--lua/mason/packages/rescript-lsp/init.lua19
-rw-r--r--lua/mason/packages/rnix-lsp/init.lua13
-rw-r--r--lua/mason/packages/robotframework-lsp/init.lua11
-rw-r--r--lua/mason/packages/rome/init.lua19
-rw-r--r--lua/mason/packages/rust-analyzer/init.lua51
-rw-r--r--lua/mason/packages/salt-lsp/init.lua11
-rw-r--r--lua/mason/packages/serve-d/init.lua47
-rw-r--r--lua/mason/packages/shellcheck/init.lua38
-rw-r--r--lua/mason/packages/shopify-theme-check/init.lua11
-rw-r--r--lua/mason/packages/slint-lsp/init.lua32
-rw-r--r--lua/mason/packages/solang/init.lua61
-rw-r--r--lua/mason/packages/solargraph/init.lua11
-rw-r--r--lua/mason/packages/solidity/init.lua30
-rw-r--r--lua/mason/packages/sorbet/init.lua11
-rw-r--r--lua/mason/packages/sourcery/init.lua11
-rw-r--r--lua/mason/packages/sqlls/init.lua11
-rw-r--r--lua/mason/packages/sqls/init.lua11
-rw-r--r--lua/mason/packages/stylelint-lsp/init.lua11
-rw-r--r--lua/mason/packages/stylua/init.lua13
-rw-r--r--lua/mason/packages/svelte-language-server/init.lua11
-rw-r--r--lua/mason/packages/svlangserver/init.lua11
-rw-r--r--lua/mason/packages/svls/init.lua13
-rw-r--r--lua/mason/packages/tailwindcss-language-server/init.lua11
-rw-r--r--lua/mason/packages/taplo/init.lua14
-rw-r--r--lua/mason/packages/teal-language-server/init.lua14
-rw-r--r--lua/mason/packages/terraform-ls/init.lua33
-rw-r--r--lua/mason/packages/texlab/init.lua39
-rw-r--r--lua/mason/packages/tflint/init.lua30
-rw-r--r--lua/mason/packages/typescript-language-server/init.lua11
-rw-r--r--lua/mason/packages/vala-language-server/init.lua40
-rw-r--r--lua/mason/packages/verible/init.lua85
-rw-r--r--lua/mason/packages/vetur-vls/init.lua11
-rw-r--r--lua/mason/packages/vim-language-server/init.lua11
-rw-r--r--lua/mason/packages/visualforce-language-server/init.lua32
-rw-r--r--lua/mason/packages/vls/init.lua36
-rw-r--r--lua/mason/packages/vue-language-server/init.lua11
-rw-r--r--lua/mason/packages/wgsl-analyzer/init.lua16
-rw-r--r--lua/mason/packages/yaml-language-server/init.lua11
-rw-r--r--lua/mason/packages/zk/init.lua51
-rw-r--r--lua/mason/packages/zls/init.lua32
-rw-r--r--lua/mason/settings.lua79
-rw-r--r--lua/mason/ui/components/footer.lua17
-rw-r--r--lua/mason/ui/components/header.lua22
-rw-r--r--lua/mason/ui/components/help/dap.lua20
-rw-r--r--lua/mason/ui/components/help/init.lua153
-rw-r--r--lua/mason/ui/components/help/lsp.lua23
-rw-r--r--lua/mason/ui/components/json-schema.lua (renamed from lua/nvim-lsp-installer/ui/components/settings-schema.lua)54
-rw-r--r--lua/mason/ui/components/language-filter.lua31
-rw-r--r--lua/mason/ui/components/main/init.lua12
-rw-r--r--lua/mason/ui/components/main/package_list.lua291
-rw-r--r--lua/mason/ui/components/tabs.lua38
-rw-r--r--lua/mason/ui/init.lua11
-rw-r--r--lua/mason/ui/instance.lua578
-rw-r--r--lua/mason/ui/palette.lua55
-rw-r--r--lua/nvim-lsp-installer.lua284
-rw-r--r--lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua47
-rw-r--r--lua/nvim-lsp-installer/_generated/metadata.lua373
-rw-r--r--lua/nvim-lsp-installer/_generated/schemas/jdtls.lua3
-rw-r--r--lua/nvim-lsp-installer/_generated/schemas/julials.lua3
-rw-r--r--lua/nvim-lsp-installer/_generated/schemas/perlnavigator.lua3
-rw-r--r--lua/nvim-lsp-installer/_generated/schemas/pylsp.lua3
-rw-r--r--lua/nvim-lsp-installer/_generated/schemas/rust_analyzer.lua3
-rw-r--r--lua/nvim-lsp-installer/_generated/schemas/sumneko_lua.lua3
-rw-r--r--lua/nvim-lsp-installer/_generated/schemas/svelte.lua3
-rw-r--r--lua/nvim-lsp-installer/core/fetch.lua54
-rw-r--r--lua/nvim-lsp-installer/core/functional/string.lua30
-rw-r--r--lua/nvim-lsp-installer/core/functional/table.lua9
-rw-r--r--lua/nvim-lsp-installer/core/installer/context.lua199
-rw-r--r--lua/nvim-lsp-installer/core/installer/init.lua87
-rw-r--r--lua/nvim-lsp-installer/dispatcher.lua23
-rw-r--r--lua/nvim-lsp-installer/jobs/outdated-servers/init.lua94
-rw-r--r--lua/nvim-lsp-installer/jobs/outdated-servers/jdtls.lua16
-rw-r--r--lua/nvim-lsp-installer/jobs/outdated-servers/version-check-result.lua39
-rw-r--r--lua/nvim-lsp-installer/jobs/pool.lua41
-rw-r--r--lua/nvim-lsp-installer/jobs/version-check/init.lua78
-rw-r--r--lua/nvim-lsp-installer/middleware.lua76
-rw-r--r--lua/nvim-lsp-installer/server.lua182
-rw-r--r--lua/nvim-lsp-installer/servers/angularls/init.lua49
-rw-r--r--lua/nvim-lsp-installer/servers/ansiblels/init.lua23
-rw-r--r--lua/nvim-lsp-installer/servers/apex_ls/init.lua43
-rw-r--r--lua/nvim-lsp-installer/servers/arduino_language_server/README.md68
-rw-r--r--lua/nvim-lsp-installer/servers/arduino_language_server/init.lua62
-rw-r--r--lua/nvim-lsp-installer/servers/asm_lsp/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/astro/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/awk_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/bashls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/beancount/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/bicep/init.lua32
-rw-r--r--lua/nvim-lsp-installer/servers/bsl_ls/init.lua31
-rw-r--r--lua/nvim-lsp-installer/servers/ccls/init.lua24
-rw-r--r--lua/nvim-lsp-installer/servers/clangd/init.lua38
-rw-r--r--lua/nvim-lsp-installer/servers/clarity_lsp/init.lua31
-rw-r--r--lua/nvim-lsp-installer/servers/clojure_lsp/init.lua33
-rw-r--r--lua/nvim-lsp-installer/servers/cmake/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/codeqlls/init.lua31
-rw-r--r--lua/nvim-lsp-installer/servers/crystalline/init.lua34
-rw-r--r--lua/nvim-lsp-installer/servers/csharp_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/cssls/init.lua1
-rw-r--r--lua/nvim-lsp-installer/servers/cssmodules_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/cucumber_language_server/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/dartls/init.lua13
-rw-r--r--lua/nvim-lsp-installer/servers/denols/init.lua37
-rw-r--r--lua/nvim-lsp-installer/servers/dhall_lsp_server/init.lua68
-rw-r--r--lua/nvim-lsp-installer/servers/diagnosticls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/dockerls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/dotls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/efm/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/elixirls/init.lua35
-rw-r--r--lua/nvim-lsp-installer/servers/elmls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/ember/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/emmet_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/erlangls/init.lua36
-rw-r--r--lua/nvim-lsp-installer/servers/esbonio/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/eslint/README.md15
-rw-r--r--lua/nvim-lsp-installer/servers/eslint/init.lua1
-rw-r--r--lua/nvim-lsp-installer/servers/flux_lsp/init.lua17
-rw-r--r--lua/nvim-lsp-installer/servers/foam_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/fortls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/fsautocomplete/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/golangci_lint_ls/init.lua18
-rw-r--r--lua/nvim-lsp-installer/servers/gopls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/grammarly/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/graphql/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/groovyls/init.lua26
-rw-r--r--lua/nvim-lsp-installer/servers/haxe_language_server/init.lua24
-rw-r--r--lua/nvim-lsp-installer/servers/hls/init.lua42
-rw-r--r--lua/nvim-lsp-installer/servers/hoon_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/html/init.lua1
-rw-r--r--lua/nvim-lsp-installer/servers/init.lua297
-rw-r--r--lua/nvim-lsp-installer/servers/intelephense/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/jdtls/init.lua97
-rw-r--r--lua/nvim-lsp-installer/servers/jedi_language_server/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/jsonls/init.lua1
-rw-r--r--lua/nvim-lsp-installer/servers/jsonnet_ls/init.lua16
-rw-r--r--lua/nvim-lsp-installer/servers/julials/init.lua102
-rw-r--r--lua/nvim-lsp-installer/servers/kotlin_language_server/init.lua30
-rw-r--r--lua/nvim-lsp-installer/servers/lelwel_ls/init.lua17
-rw-r--r--lua/nvim-lsp-installer/servers/lemminx/init.lua46
-rw-r--r--lua/nvim-lsp-installer/servers/ltex/init.lua77
-rw-r--r--lua/nvim-lsp-installer/servers/marksman/init.lua34
-rw-r--r--lua/nvim-lsp-installer/servers/mm0_ls/init.lua25
-rw-r--r--lua/nvim-lsp-installer/servers/nickel_ls/init.lua26
-rw-r--r--lua/nvim-lsp-installer/servers/nimls/init.lua22
-rw-r--r--lua/nvim-lsp-installer/servers/ocamlls/init.lua19
-rw-r--r--lua/nvim-lsp-installer/servers/ocamllsp/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/omnisharp/init.lua76
-rw-r--r--lua/nvim-lsp-installer/servers/opencl_ls/init.lua41
-rw-r--r--lua/nvim-lsp-installer/servers/perlnavigator/init.lua20
-rw-r--r--lua/nvim-lsp-installer/servers/phpactor/init.lua25
-rw-r--r--lua/nvim-lsp-installer/servers/powershell_es/init.lua23
-rw-r--r--lua/nvim-lsp-installer/servers/prismals/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/prosemd_lsp/init.lua34
-rw-r--r--lua/nvim-lsp-installer/servers/psalm/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/puppet/init.lua25
-rw-r--r--lua/nvim-lsp-installer/servers/purescriptls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/pylsp/init.lua63
-rw-r--r--lua/nvim-lsp-installer/servers/pyright/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/quick_lint_js/init.lua55
-rw-r--r--lua/nvim-lsp-installer/servers/reason_ls/init.lua35
-rw-r--r--lua/nvim-lsp-installer/servers/remark_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/rescriptls/init.lua23
-rw-r--r--lua/nvim-lsp-installer/servers/rnix/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/robotframework_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/rome/init.lua22
-rw-r--r--lua/nvim-lsp-installer/servers/rust_analyzer/init.lua65
-rw-r--r--lua/nvim-lsp-installer/servers/salt_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/scry/init.lua30
-rw-r--r--lua/nvim-lsp-installer/servers/serve_d/init.lua47
-rw-r--r--lua/nvim-lsp-installer/servers/slint_lsp/init.lua36
-rw-r--r--lua/nvim-lsp-installer/servers/solang/init.lua70
-rw-r--r--lua/nvim-lsp-installer/servers/solargraph/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/solc/init.lua34
-rw-r--r--lua/nvim-lsp-installer/servers/solidity_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/sorbet/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/sourcekit/init.lua13
-rw-r--r--lua/nvim-lsp-installer/servers/sourcery/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/sqlls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/sqls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/stylelint_lsp/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/sumneko_lua/init.lua56
-rw-r--r--lua/nvim-lsp-installer/servers/svelte/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/svlangserver/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/svls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/tailwindcss/init.lua14
-rw-r--r--lua/nvim-lsp-installer/servers/taplo/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/teal_ls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/terraformls/init.lua50
-rw-r--r--lua/nvim-lsp-installer/servers/texlab/init.lua41
-rw-r--r--lua/nvim-lsp-installer/servers/tflint/init.lua66
-rw-r--r--lua/nvim-lsp-installer/servers/theme_check/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/tsserver/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/vala_ls/init.lua41
-rw-r--r--lua/nvim-lsp-installer/servers/verible/init.lua73
-rw-r--r--lua/nvim-lsp-installer/servers/vimls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/visualforce_ls/init.lua50
-rw-r--r--lua/nvim-lsp-installer/servers/vls/init.lua42
-rw-r--r--lua/nvim-lsp-installer/servers/volar/init.lua37
-rw-r--r--lua/nvim-lsp-installer/servers/vscode-langservers-extracted/init.lua17
-rw-r--r--lua/nvim-lsp-installer/servers/vuels/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/wgsl_analyzer/init.lua19
-rw-r--r--lua/nvim-lsp-installer/servers/yamlls/init.lua15
-rw-r--r--lua/nvim-lsp-installer/servers/zk/init.lua54
-rw-r--r--lua/nvim-lsp-installer/servers/zls/init.lua43
-rw-r--r--lua/nvim-lsp-installer/settings.lua94
-rw-r--r--lua/nvim-lsp-installer/ui/init.lua1106
-rw-r--r--lua/nvim-lsp-installer/ui/server_hints.lua41
418 files changed, 7463 insertions, 7186 deletions
diff --git a/lua/mason-lspconfig/init.lua b/lua/mason-lspconfig/init.lua
new file mode 100644
index 00000000..850c1069
--- /dev/null
+++ b/lua/mason-lspconfig/init.lua
@@ -0,0 +1,139 @@
+local log = require "mason.log"
+local Package = require "mason.core.package"
+local Optional = require "mason.core.optional"
+local _ = require "mason.core.functional"
+local settings = require "mason-lspconfig.settings"
+local server_mapping = require "mason-lspconfig.server-mapping"
+
+local M = {}
+
+---@param lspconfig_server_name string
+function M.resolve_package(lspconfig_server_name)
+ return Optional.of_nilable(server_mapping.lspconfig_to_package[lspconfig_server_name]):map(function(package_name)
+ local ok, package = pcall(require, ("mason.packages.%s"):format(package_name))
+ if ok then
+ return package
+ end
+ end)
+end
+
+---@param lspconfig_server_name string
+function M.resolve_server_config_factory(lspconfig_server_name)
+ local ok, server_config = pcall(
+ require,
+ ("mason.adapters.lspconfig.server_configurations.%s"):format(lspconfig_server_name)
+ )
+ if ok then
+ return Optional.of(server_config)
+ end
+ return Optional.empty()
+end
+
+---@param t1 table
+---@param t2 table
+local function merge_in_place(t1, t2)
+ for k, v in pairs(t2) do
+ if type(v) == "table" then
+ if type(t1[k]) == "table" and not vim.tbl_islist(t1[k]) then
+ merge_in_place(t1[k], v)
+ else
+ t1[k] = v
+ end
+ else
+ t1[k] = v
+ end
+ end
+ return t1
+end
+
+local memoized_set = _.memoize(_.set_of)
+
+---@param server_name string
+local function should_auto_install(server_name)
+ if settings.current.automatic_installation == true then
+ return true
+ end
+ if type(settings.current.automatic_installation) == "table" then
+ return not memoized_set(settings.current.automatic_installation.exclude)[server_name]
+ end
+ return false
+end
+
+local function setup_lspconfig_hook()
+ local util = require "lspconfig.util"
+ util.on_setup = util.add_hook_before(util.on_setup, function(config)
+ M.resolve_package(config.name):if_present(
+ ---@param pkg Package
+ function(pkg)
+ if pkg:is_installed() then
+ M.resolve_server_config_factory(config.name):if_present(function(config_factory)
+ merge_in_place(config, config_factory(pkg:get_install_path()))
+ end)
+ else
+ if should_auto_install(config.name) then
+ pkg:install()
+ end
+ end
+ end
+ )
+ end)
+end
+
+local function ensure_installed()
+ for _, server_identifier in ipairs(settings.current.ensure_installed) do
+ local server_name, version = Package.Parse(server_identifier)
+ M.resolve_package(server_name):if_present(
+ ---@param pkg Package
+ function(pkg)
+ if not pkg:is_installed() then
+ pkg:install {
+ version = version,
+ }
+ end
+ end
+ )
+ end
+end
+
+---@param config MasonLspconfigSettings | nil
+function M.setup(config)
+ if config then
+ settings.set(config)
+ end
+
+ setup_lspconfig_hook()
+ ensure_installed()
+end
+
+---@param handlers table<string, fun(server_name: string)>
+function M.setup_handlers(handlers)
+ local default_handler = Optional.of_nilable(handlers[1])
+ local indexer = require "mason.core.package.indexer"
+
+ ---@param pkg_name string
+ local function get_server_name(pkg_name)
+ return Optional.of_nilable(server_mapping.package_to_lspconfig[pkg_name])
+ end
+
+ local function call_handler(server_name)
+ log.fmt_trace("Checking handler for %s", server_name)
+ Optional.of_nilable(handlers[server_name]):or_(_.always(default_handler)):if_present(function(handler)
+ log.fmt_trace("Calling handler for %s", server_name)
+ local ok, err = pcall(handler, server_name)
+ if not ok then
+ vim.notify(err, vim.log.levels.ERROR)
+ end
+ end)
+ end
+
+ local installed_servers = _.filter_map(get_server_name, indexer.get_installed_package_names())
+ _.each(call_handler, installed_servers)
+ indexer:on(
+ "package:install:success",
+ vim.schedule_wrap(function(pkg)
+ get_server_name(pkg.name):if_present(call_handler)
+ end)
+ )
+end
+
+return M
diff --git a/lua/mason-lspconfig/server-mapping.lua b/lua/mason-lspconfig/server-mapping.lua
new file mode 100644
index 00000000..89290c1c
--- /dev/null
+++ b/lua/mason-lspconfig/server-mapping.lua
@@ -0,0 +1,130 @@
+local _ = require "mason.core.functional"
+
+local M = {}
+
+---Maps lspconfig server config name to its corresponding package name.
+-- TODO go through these.. fun times
+M.lspconfig_to_package = {
+ ["angularls"] = "angular-language-server",
+ ["ansiblels"] = "ansible-language-server",
+ ["apex_ls"] = "apex-language-server",
+ ["arduino_language_server"] = "arduino-language-server",
+ ["asm_lsp"] = "asm-lsp",
+ ["astro"] = "astro-language-server",
+ ["awk_ls"] = "awk-language-server",
+ ["bashls"] = "bash-language-server",
+ ["beancount"] = "beancount-language-server",
+ ["bicep"] = "bicep-lsp",
+ ["bsl_ls"] = "bsl-language-server",
+ ["ccls"] = "ccls",
+ ["clangd"] = "clangd",
+ ["clarity_lsp"] = "clarity-lsp",
+ ["clojure_lsp"] = "clojure-lsp",
+ ["cmake"] = "cmake-language-server",
+ ["codeqlls"] = "codeql",
+ ["crystalline"] = "crystalline",
+ ["csharp_ls"] = "csharp-language-server",
+ ["cssls"] = "css-lsp",
+ ["cssmodules_ls"] = "cucumber-language-server",
+ ["cucumber_language_server"] = "cucumber-language-server",
+ ["denols"] = "deno-lsp",
+ ["dhall_lsp_server"] = "dhall-lsp",
+ ["diagnosticls"] = "diagnostic-languageserver",
+ ["dockerls"] = "dockerfile-language-server",
+ ["dotls"] = "dot-language-server",
+ ["efm"] = "efm",
+ ["elixirls"] = "elixir-ls",
+ ["elmls"] = "elm-language-server",
+ ["ember"] = "ember-language-server",
+ ["emmet_ls"] = "emmet-ls",
+ ["erlangls"] = "erlang-ls",
+ ["esbonio"] = "esbonio",
+ ["eslint"] = "eslint-lsp",
+ ["flux_lsp"] = "flux-lsp",
+ ["foam_ls"] = "foam-language-server",
+ ["fortls"] = "fortls",
+ ["fsautocomplete"] = "fsautocomplete",
+ ["golangci_lint_ls"] = "golangci-lint-langserver",
+ ["gopls"] = "gopls",
+ ["grammarly"] = "grammarly-languageserver",
+ ["graphql"] = "graphql-language-service-cli",
+ ["groovyls"] = "groovy-language-server",
+ ["haxe_language_server"] = "haxe-language-server",
+ ["hls"] = "haskell-language-server",
+ ["hoon_ls"] = "hoon-language-server",
+ ["html"] = "html-lsp",
+ ["intelephense"] = "intelephense",
+ ["jdtls"] = "jdtls",
+ ["jedi_language_server"] = "jedi-language-server",
+ ["jsonls"] = "json-lsp",
+ ["jsonnet_ls"] = "jsonnet-language-server",
+ ["julials"] = "julia-lsp",
+ ["kotlin_language_server"] = "kotlin-language-server",
+ ["lelwel_ls"] = "lelwel",
+ ["lemminx"] = "lemminx",
+ ["ltex"] = "ltex-ls",
+ ["marksman"] = "marksman",
+ ["mm0_ls"] = "metamath-zero-lsp",
+ ["nickel_ls"] = "nickel-lang-lsp",
+ ["nimls"] = "nimlsp",
+ ["ocamllsp"] = "ocaml-lsp",
+ ["omnisharp"] = "omnisharp-roslyn",
+ ["opencl_ls"] = "opencl-language-server",
+ ["perlnavigator"] = "perlnavigator",
+ ["phpactor"] = "phpactor",
+ ["powershell_es"] = "powershell-editor-services",
+ ["prismals"] = "prisma-language-server",
+ ["prosemd_lsp"] = "prosemd-lsp",
+ ["psalm"] = "psalm",
+ ["puppet"] = "puppet-editor-services",
+ ["purescriptls"] = "purescript-language-server",
+ ["pylsp"] = "python-lsp-server",
+ ["pyright"] = "pyright",
+ ["quick_lint_js"] = "quick-lint-js",
+ ["r_language_server"] = "r-languageserver",
+ ["reason_ls"] = "reason-language-server",
+ ["remark_ls"] = "remark-language-server",
+ ["rescriptls"] = "rescript-lsp",
+ ["rnix"] = "rnix-lsp",
+ ["robotframework_ls"] = "robotframework-lsp",
+ ["rome"] = "rome",
+ ["rust_analyzer"] = "rust-analyzer",
+ ["salt_ls"] = "salt-lsp",
+ ["scry"] = "scry",
+ ["serve_d"] = "serve-d",
+ ["slint_lsp"] = "slint-lsp",
+ ["solang"] = "solang",
+ ["solargraph"] = "solargraph",
+ ["solc"] = "solidity",
+ ["sorbet"] = "sorbet",
+ ["sourcery"] = "sourcery",
+ ["sqlls"] = "sqlls",
+ ["sqls"] = "sqls",
+ ["stylelint_lsp"] = "stylelint-lsp",
+ ["sumneko_lua"] = "lua-language-server",
+ ["svelte"] = "svelte-language-server",
+ ["svlangserver"] = "svlangserver",
+ ["svls"] = "svls",
+ ["tailwindcss"] = "tailwindcss-language-server",
+ ["taplo"] = "taplo",
+ ["teal_ls"] = "teal-language-server",
+ ["terraformls"] = "terraform-ls",
+ ["texlab"] = "texlab",
+ ["tflint"] = "tflint",
+ ["theme_check"] = "shopify-theme-check",
+ ["tsserver"] = "typescript-language-server",
+ ["vala_ls"] = "vala-language-server",
+ ["verible"] = "verible",
+ ["vimls"] = "vim-language-server",
+ ["visualforce_ls"] = "visualforce-language-server",
+ ["vls"] = "vls",
+ ["volar"] = "vue-language-server",
+ ["vuels"] = "vetur-vls",
+ ["yamlls"] = "yaml-language-server",
+ ["zk"] = "zk",
+ ["zls"] = "zls",
+}
+
+M.package_to_lspconfig = _.invert(M.lspconfig_to_package)
+
+return M
diff --git a/lua/mason-lspconfig/server_configurations/angularls/init.lua b/lua/mason-lspconfig/server_configurations/angularls/init.lua
new file mode 100644
index 00000000..c9076c4e
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/angularls/init.lua
@@ -0,0 +1,41 @@
+local platform = require "mason.core.platform"
+local npm = require "mason.core.managers.npm"
+local _ = require "mason.core.functional"
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ local append_node_modules = _.map(function(dir)
+ return path.concat { dir, "node_modules" }
+ end)
+
+ local function get_cmd(workspace_dir)
+ local cmd = {
+ "ngserver",
+ "--stdio",
+ "--tsProbeLocations",
+ table.concat(append_node_modules { install_dir, workspace_dir }, ","),
+ "--ngProbeLocations",
+ table.concat(
+ append_node_modules {
+ path.concat { install_dir, "node_modules", "@angular", "language-server" },
+ workspace_dir,
+ },
+ ","
+ ),
+ }
+ if platform.is_win then
+ cmd[1] = vim.fn.exepath(cmd[1])
+ end
+
+ return cmd
+ end
+
+ return {
+ cmd = get_cmd(vim.loop.cwd()),
+ cmd_env = npm.env(install_dir),
+ on_new_config = function(new_config, root_dir)
+ new_config.cmd = get_cmd(root_dir)
+ end,
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/apex_ls/init.lua b/lua/mason-lspconfig/server_configurations/apex_ls/init.lua
new file mode 100644
index 00000000..3067a080
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/apex_ls/init.lua
@@ -0,0 +1,8 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ apex_jar_path = path.concat { install_dir, "apex-jorje-lsp.jar" },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/bicep/init.lua b/lua/mason-lspconfig/server_configurations/bicep/init.lua
new file mode 100644
index 00000000..93bac594
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/bicep/init.lua
@@ -0,0 +1,8 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = { "dotnet", path.concat { install_dir, "Bicep.LangServer.dll" } },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/bsl_ls/init.lua b/lua/mason-lspconfig/server_configurations/bsl_ls/init.lua
new file mode 100644
index 00000000..51c3b328
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/bsl_ls/init.lua
@@ -0,0 +1,12 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = {
+ "java",
+ "-jar",
+ path.concat { install_dir, "bsl-lsp.jar" },
+ },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/elixirls/init.lua b/lua/mason-lspconfig/server_configurations/elixirls/init.lua
new file mode 100644
index 00000000..08bf6315
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/elixirls/init.lua
@@ -0,0 +1,15 @@
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = {
+ path.concat {
+ install_dir,
+ "elixir-ls",
+ platform.is_win and "language_server.bat" or "language_server.sh",
+ },
+ },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/esbonio/init.lua b/lua/mason-lspconfig/server_configurations/esbonio/init.lua
new file mode 100644
index 00000000..998c5594
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/esbonio/init.lua
@@ -0,0 +1,6 @@
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = { "esbonio" },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/groovyls/init.lua b/lua/mason-lspconfig/server_configurations/groovyls/init.lua
new file mode 100644
index 00000000..c917fcf2
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/groovyls/init.lua
@@ -0,0 +1,8 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = { "java", "-jar", path.concat { install_dir, "build", "libs", "groovyls-all.jar" } },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/haxe_language_server/init.lua b/lua/mason-lspconfig/server_configurations/haxe_language_server/init.lua
new file mode 100644
index 00000000..4f8fb070
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/haxe_language_server/init.lua
@@ -0,0 +1,8 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = { "node", path.concat { install_dir, "bin", "server.js" } },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/jdtls/README.md b/lua/mason-lspconfig/server_configurations/jdtls/README.md
new file mode 100644
index 00000000..fa801337
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/jdtls/README.md
@@ -0,0 +1,33 @@
+# jdtls
+
+## Customizing JVM arguments
+
+It's possible to customize some of the JVM arguments used to launch the server by setting the `vmargs` configuration.
+This can for example be used to change the memory configuration.
+
+Example::
+
+```lua
+lspconfig.jdtls.setup {
+ vmargs = {
+ "-XX:+UseParallelGC",
+ "-XX:GCTimeRatio=4",
+ "-XX:AdaptiveSizePolicyWeight=90",
+ "-Dsun.zip.disableMemoryMapping=true",
+ "-Djava.import.generatesMetadataFilesAtProjectRoot=false",
+ "-Xmx1G",
+ "-Xms100m",
+ }
+}
+```
+
+## Enable Lombok support
+
+Lombok support is disabled by default. To enable Lombok support, set the `use_lombok_agent` configuration to `true`
+during setup, like so:
+
+```lua
+lspconfig.jdtls.setup {
+ use_lombok_agent = true
+}
+```
diff --git a/lua/mason-lspconfig/server_configurations/jdtls/init.lua b/lua/mason-lspconfig/server_configurations/jdtls/init.lua
new file mode 100644
index 00000000..28b69d30
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/jdtls/init.lua
@@ -0,0 +1,78 @@
+local path = require "mason.core.path"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+
+---@param install_dir string
+return function(install_dir)
+ ---@param workspace_root string
+ ---@param workspace_path string|nil @The path to the server instance's current workspace. Can be nil when running in single file mode.
+ ---@param vmargs string[]
+ ---@param use_lombok_agent boolean
+ local function get_cmd(workspace_root, workspace_path, vmargs, use_lombok_agent)
+ local executable = vim.env.JAVA_HOME and path.concat { vim.env.JAVA_HOME, "bin", "java" } or "java"
+ local jar = vim.fn.expand(path.concat { install_dir, "plugins", "org.eclipse.equinox.launcher_*.jar" })
+ local lombok = vim.fn.expand(path.concat { install_dir, "lombok.jar" })
+ local workspace_dir = vim.fn.fnamemodify(workspace_path or vim.fn.getcwd(), ":p:h:t")
+
+ local cmd = _.list_not_nil(
+ platform.is_win and ("%s.exe"):format(executable) or executable,
+ "-Declipse.application=org.eclipse.jdt.ls.core.id1",
+ "-Dosgi.bundles.defaultStartLevel=4",
+ "-Declipse.product=org.eclipse.jdt.ls.core.product",
+ _.when(platform.is.win, "-DwatchParentProcess=false"), -- https://github.com/redhat-developer/vscode-java/pull/847
+ "--add-modules=ALL-SYSTEM",
+ "--add-opens",
+ "java.base/java.util=ALL-UNNAMED",
+ "--add-opens",
+ "java.base/java.lang=ALL-UNNAMED",
+ "--add-opens",
+ "java.base/sun.nio.fs=ALL-UNNAMED", -- https://github.com/redhat-developer/vscode-java/issues/2264
+ _.when(use_lombok_agent, "-javaagent:" .. lombok), -- javaagent needs to come before -jar flag
+ "-jar",
+ jar,
+ "-configuration",
+ path.concat {
+ install_dir,
+ _.coalesce(
+ _.when(platform.is.mac, "config_mac"),
+ _.when(platform.is.linux, "config_linux"),
+ _.when(platform.is.win, "config_win")
+ ),
+ },
+ "-data",
+ path.concat { workspace_root, workspace_dir }
+ )
+
+ return vim.list_extend(cmd, vmargs)
+ end
+
+ local DEFAULT_VMARGS = {
+ "-XX:+UseParallelGC",
+ "-XX:GCTimeRatio=4",
+ "-XX:AdaptiveSizePolicyWeight=90",
+ "-Dsun.zip.disableMemoryMapping=true",
+ "-Djava.import.generatesMetadataFilesAtProjectRoot=false",
+ "-Xmx1G",
+ "-Xms100m",
+ }
+
+ return {
+ cmd = get_cmd(
+ vim.env.WORKSPACE and vim.env.WORKSPACE or path.concat { vim.env.HOME, "workspace" },
+ vim.loop.cwd(),
+ DEFAULT_VMARGS,
+ false
+ ),
+ on_new_config = function(config, workspace_path)
+ -- We redefine the cmd in on_new_config because `cmd` will be invalid if the user has not installed
+ -- jdtls when starting the session (due to vim.fn.expand returning an empty string, because it can't
+ -- locate the file).
+ config.cmd = get_cmd(
+ vim.env.WORKSPACE and vim.env.WORKSPACE or path.concat { vim.env.HOME, "workspace" },
+ workspace_path,
+ config.vmargs or DEFAULT_VMARGS,
+ config.use_lombok_agent or false
+ )
+ end,
+ }
+end
diff --git a/lua/nvim-lsp-installer/servers/julials/README.md b/lua/mason-lspconfig/server_configurations/julials/README.md
index 18e6880d..18e6880d 100644
--- a/lua/nvim-lsp-installer/servers/julials/README.md
+++ b/lua/mason-lspconfig/server_configurations/julials/README.md
diff --git a/lua/mason-lspconfig/server_configurations/julials/init.lua b/lua/mason-lspconfig/server_configurations/julials/init.lua
new file mode 100644
index 00000000..afa89662
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/julials/init.lua
@@ -0,0 +1,50 @@
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local fs = require "mason.core.fs"
+local _ = require "mason.core.functional"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ on_new_config = function(config, workspace_dir)
+ local env_path = config.julia_env_path and vim.fn.expand(config.julia_env_path)
+ if not env_path then
+ local file_exists = _.compose(fs.sync.file_exists, path.concat, _.concat { workspace_dir })
+ if file_exists { "Project.toml" } and file_exists { "Manifest.toml" } then
+ env_path = workspace_dir
+ elseif file_exists { "JuliaProject.toml" } and file_exists { "JuliaManifest.toml" } then
+ env_path = workspace_dir
+ end
+ end
+
+ if not env_path then
+ local ok, env = pcall(vim.fn.system, {
+ "julia",
+ "--startup-file=no",
+ "--history-file=no",
+ "-e",
+ "using Pkg; print(dirname(Pkg.Types.Context().env.project_file))",
+ })
+ if ok then
+ env_path = env
+ end
+ end
+
+ config.cmd = {
+ "julia",
+ "--startup-file=no",
+ "--history-file=no",
+ "--depwarn=no",
+ ("--project=%s"):format(path.concat { install_dir, "scripts", "environments", "languageserver" }),
+ path.concat { install_dir, "nvim-lsp.jl" },
+ vim.env.JULIA_DEPOT_PATH or "",
+ path.concat { install_dir, "symbolstorev5" },
+ env_path,
+ }
+ end,
+ cmd_env = {
+ JULIA_DEPOT_PATH = path.concat { install_dir, "lsdepot" },
+ JULIA_LOAD_PATH = platform.is.win and ";" or ":",
+ },
+ }
+end
diff --git a/lua/nvim-lsp-installer/servers/omnisharp/README.md b/lua/mason-lspconfig/server_configurations/omnisharp/README.md
index 3aec548b..3aec548b 100644
--- a/lua/nvim-lsp-installer/servers/omnisharp/README.md
+++ b/lua/mason-lspconfig/server_configurations/omnisharp/README.md
diff --git a/lua/mason-lspconfig/server_configurations/omnisharp/init.lua b/lua/mason-lspconfig/server_configurations/omnisharp/init.lua
new file mode 100644
index 00000000..5ff2b9fc
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/omnisharp/init.lua
@@ -0,0 +1,32 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+---@param use_mono boolean
+local function generate_cmd(install_dir, use_mono)
+ if use_mono then
+ return {
+ "mono",
+ path.concat { install_dir, "omnisharp-mono", "OmniSharp.exe" },
+ "--languageserver",
+ "--hostPID",
+ tostring(vim.fn.getpid()),
+ }
+ else
+ return {
+ "dotnet",
+ path.concat { install_dir, "omnisharp", "OmniSharp.dll" },
+ "--languageserver",
+ "--hostPID",
+ tostring(vim.fn.getpid()),
+ }
+ end
+end
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ on_new_config = function(config)
+ config.cmd = generate_cmd(install_dir, config.use_mono)
+ end,
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/perlnavigator/init.lua b/lua/mason-lspconfig/server_configurations/perlnavigator/init.lua
new file mode 100644
index 00000000..bf59e06d
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/perlnavigator/init.lua
@@ -0,0 +1,12 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = {
+ "node",
+ path.concat { install_dir, "node_modules", "perlnavigator-server", "out", "server.js" },
+ "--stdio",
+ },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/powershell_es/init.lua b/lua/mason-lspconfig/server_configurations/powershell_es/init.lua
new file mode 100644
index 00000000..d36a580b
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/powershell_es/init.lua
@@ -0,0 +1,6 @@
+---@param install_dir string
+return function(install_dir)
+ return {
+ bundle_path = install_dir,
+ }
+end
diff --git a/lua/nvim-lsp-installer/servers/pylsp/README.md b/lua/mason-lspconfig/server_configurations/pylsp/README.md
index 2434bb4b..2434bb4b 100644
--- a/lua/nvim-lsp-installer/servers/pylsp/README.md
+++ b/lua/mason-lspconfig/server_configurations/pylsp/README.md
diff --git a/lua/mason-lspconfig/server_configurations/pylsp/init.lua b/lua/mason-lspconfig/server_configurations/pylsp/init.lua
new file mode 100644
index 00000000..26da1dfd
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/pylsp/init.lua
@@ -0,0 +1,51 @@
+local a = require "mason.core.async"
+local _ = require "mason.core.functional"
+local pip3 = require "mason.core.managers.pip3"
+local process = require "mason.core.process"
+local notify = require "mason.notify"
+local spawn = require "mason.core.spawn"
+
+---@param install_dir string
+return function(install_dir)
+ vim.api.nvim_create_user_command(
+ "PylspInstall",
+ a.scope(function(opts)
+ local plugins = opts.fargs
+ local plugins_str = table.concat(plugins, ", ")
+ notify(("Installing %s..."):format(plugins_str))
+ local result = spawn.pip {
+ "install",
+ "-U",
+ "--disable-pip-version-check",
+ plugins,
+ stdio_sink = process.simple_sink(),
+ with_paths = { pip3.venv_path(install_dir) },
+ }
+ if vim.in_fast_event() then
+ a.scheduler()
+ end
+ result
+ :on_success(function()
+ notify(("Successfully installed pylsp plugins %s"):format(plugins_str))
+ end)
+ :on_failure(function()
+ notify("Failed to install requested pylsp plugins.", vim.log.levels.ERROR)
+ end)
+ end),
+ {
+ desc = "[mason.nvim] Installs the provided packages in the same venv as pylsp.",
+ nargs = "+",
+ complete = _.always {
+ "pyls-flake8",
+ "pylsp-mypy",
+ "pyls-spyder",
+ "pyls-isort",
+ "python-lsp-black",
+ "pyls-memestra",
+ "pylsp-rope",
+ },
+ }
+ )
+
+ return {}
+end
diff --git a/lua/mason-lspconfig/server_configurations/r_language_server/init.lua b/lua/mason-lspconfig/server_configurations/r_language_server/init.lua
new file mode 100644
index 00000000..b4659995
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/r_language_server/init.lua
@@ -0,0 +1,8 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = { "R", "--slave", "-f", path.concat { install_dir, "server.R" } },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/rescriptls/init.lua b/lua/mason-lspconfig/server_configurations/rescriptls/init.lua
new file mode 100644
index 00000000..557af1cd
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/rescriptls/init.lua
@@ -0,0 +1,8 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = { "node", path.concat { install_dir, "extension", "server", "out", "server.js" }, "--stdio" },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/solang/init.lua b/lua/mason-lspconfig/server_configurations/solang/init.lua
new file mode 100644
index 00000000..ab756afd
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/solang/init.lua
@@ -0,0 +1,14 @@
+local path = require "mason.core.path"
+local process = require "mason.core.process"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd_env = {
+ PATH = process.extend_path {
+ path.concat { install_dir, "llvm13.0", "bin" },
+ path.concat { install_dir, "llvm12.0", "bin" }, -- kept for backwards compatibility
+ },
+ },
+ }
+end
diff --git a/lua/nvim-lsp-installer/servers/tflint/README.md b/lua/mason-lspconfig/server_configurations/tflint/README.md
index 51298d69..51298d69 100644
--- a/lua/nvim-lsp-installer/servers/tflint/README.md
+++ b/lua/mason-lspconfig/server_configurations/tflint/README.md
diff --git a/lua/mason-lspconfig/server_configurations/visualforce_ls/init.lua b/lua/mason-lspconfig/server_configurations/visualforce_ls/init.lua
new file mode 100644
index 00000000..b6209385
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/visualforce_ls/init.lua
@@ -0,0 +1,21 @@
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ return {
+ cmd = {
+ "node",
+ path.concat {
+ install_dir,
+ "extension",
+ "node_modules",
+ "@salesforce",
+ "salesforcedx-visualforce-language-server",
+ "out",
+ "src",
+ "visualforceServer.js",
+ },
+ "--stdio",
+ },
+ }
+end
diff --git a/lua/mason-lspconfig/server_configurations/volar/init.lua b/lua/mason-lspconfig/server_configurations/volar/init.lua
new file mode 100644
index 00000000..80b9841a
--- /dev/null
+++ b/lua/mason-lspconfig/server_configurations/volar/init.lua
@@ -0,0 +1,29 @@
+local npm = require "mason.core.managers.npm"
+local fs = require "mason.core.fs"
+local path = require "mason.core.path"
+
+---@param install_dir string
+return function(install_dir)
+ ---@param dir string
+ local function get_tsserverlib_path(dir)
+ return path.concat { dir, "node_modules", "typescript", "lib", "tsserverlibrary.js" }
+ end
+
+ ---@param workspace_dir string|nil
+ local function get_typescript_server_path(workspace_dir)
+ local local_tsserverlib = workspace_dir ~= nil and get_tsserverlib_path(workspace_dir)
+ local vendored_tsserverlib = get_tsserverlib_path(install_dir)
+ if local_tsserverlib and fs.sync.file_exists(local_tsserverlib) then
+ return local_tsserverlib
+ else
+ return vendored_tsserverlib
+ end
+ end
+
+ return {
+ cmd_env = npm.env(install_dir),
+ on_new_config = function(new_config, new_install_dir)
+ new_config.init_options.typescript.serverPath = get_typescript_server_path(new_install_dir)
+ end,
+ }
+end
diff --git a/lua/mason-lspconfig/settings.lua b/lua/mason-lspconfig/settings.lua
new file mode 100644
index 00000000..e7dc0e57
--- /dev/null
+++ b/lua/mason-lspconfig/settings.lua
@@ -0,0 +1,27 @@
+local M = {}
+
+---@class MasonLspconfigSettings
+local DEFAULT_SETTINGS = {
+ -- A list of servers to automatically install if they're not already installed. Example: { "rust-analyzer@nightly", "sumneko_lua" }
+ -- This setting has no relation with the `automatic_installation` setting.
+ ensure_installed = {},
+
+ -- Whether servers that are set up (via lspconfig) should be automatically installed if they're not already installed.
+ -- This setting has no relation with the `ensure_installed` setting.
+ -- Can either be:
+ -- - false: Servers are not automatically installed.
+ -- - true: All servers set up via lspconfig are automatically installed.
+ -- - { exclude: string[] }: All servers set up via lspconfig, except the ones provided in the list, are automatically installed.
+ -- Example: automatic_installation = { exclude = { "rust_analyzer", "solargraph" } }
+ automatic_installation = false,
+}
+
+M._DEFAULT_SETTINGS = DEFAULT_SETTINGS
+M.current = M._DEFAULT_SETTINGS
+
+---@param opts MasonLspconfigSettings
+function M.set(opts)
+ M.current = vim.tbl_deep_extend("force", M.current, opts)
+end
+
+return M
diff --git a/lua/mason.lua b/lua/mason.lua
new file mode 100644
index 00000000..82da0570
--- /dev/null
+++ b/lua/mason.lua
@@ -0,0 +1,30 @@
+local settings = require "mason.settings"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+
+local M = {}
+
+---@param config MasonSettings | nil
+function M.setup(config)
+ if config then
+ settings.set(config)
+ end
+
+ vim.env.PATH = path.bin_prefix() .. platform.path_sep .. vim.env.PATH
+
+ require "mason.command-api"
+end
+
+---@param pkg_path string
+local function lazy_require(pkg_path)
+ return setmetatable({}, {
+ __index = function(_, k)
+ return require(pkg_path)[k]
+ end,
+ __call = function(_, ...)
+ return require(pkg_path)(...)
+ end,
+ })
+end
+
+return M
diff --git a/lua/nvim-lsp-installer/_generated/schemas/astro.lua b/lua/mason/_generated/lsp-schemas/astro-language-server.lua
index abe659ff..9a97d138 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/astro.lua
+++ b/lua/mason/_generated/lsp-schemas/astro-language-server.lua
@@ -1,3 +1,3 @@
-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
-- stylua: ignore start
-return {properties = {["astro.css.completions.emmet"] = {default = true,description = "Enable Emmet completions for CSS",title = "CSS: Emmet Completions",type = "boolean"},["astro.css.completions.enabled"] = {default = true,description = "Enable completions for CSS",title = "CSS: Completions",type = "boolean"},["astro.css.documentColors.enabled"] = {default = true,description = "Enable color picker for CSS",title = "CSS: Document Colors",type = "boolean"},["astro.css.documentSymbols.enabled"] = {default = true,description = "Enable document symbols for CSS",title = "CSS: Symbols in Outline",type = "boolean"},["astro.css.enabled"] = {default = true,description = "Enable CSS features",title = "CSS",type = "boolean"},["astro.css.hover.enabled"] = {default = true,description = "Enable hover info for CSS",title = "CSS: Hover Info",type = "boolean"},["astro.format.indentFrontmatter"] = {default = false,description = "Indent the formatter by one level of indentation",title = "Formatting: Indent frontmatter",type = "boolean"},["astro.format.newLineAfterFrontmatter"] = {default = true,description = "Add a line return between the frontmatter and the template",title = "Formatting: Add line return after the frontmatter",type = "boolean"},["astro.html.completions.emmet"] = {default = true,description = "Enable Emmet completions for HTML",title = "HTML: Emmet Completions",type = "boolean"},["astro.html.completions.enabled"] = {default = true,description = "Enable completions for HTML",title = "HTML: Completions",type = "boolean"},["astro.html.documentSymbols.enabled"] = {default = true,description = "Enable document symbols for CSS",title = "HTML: Symbols in Outline",type = "boolean"},["astro.html.enabled"] = {default = true,description = "Enable HTML features",title = "HTML",type = "boolean"},["astro.html.hover.enabled"] = {default = true,description = "Enable hover info for HTML",title = "HTML: Hover Info",type = "boolean"},["astro.html.tagComplete.enabled"] = {default = true,description = "Enable tag completion for HTML",title = "HTML: Tag Completion",type = "boolean"},["astro.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["astro.typescript.codeActions.enabled"] = {default = true,description = "Enable code actions for TypeScript",title = "TypeScript: Code Actions",type = "boolean"},["astro.typescript.completions.enabled"] = {default = true,description = "Enable completions for TypeScript",title = "TypeScript: Completions",type = "boolean"},["astro.typescript.definitions.enabled"] = {default = true,description = "Enable go to definition for TypeScript",title = "TypeScript: Go to Definition",type = "boolean"},["astro.typescript.diagnostics.enabled"] = {default = true,description = "Enable diagnostic messages for TypeScript",title = "TypeScript: Diagnostics",type = "boolean"},["astro.typescript.documentSymbols.enabled"] = {default = true,description = "Enable document symbols for TypeScript",title = "TypeScript: Symbols in Outline",type = "boolean"},["astro.typescript.enabled"] = {default = true,description = "Enable TypeScript features",title = "TypeScript",type = "boolean"},["astro.typescript.hover.enabled"] = {default = true,description = "Enable hover info for TypeScript",title = "TypeScript: Hover Info",type = "boolean"},["astro.typescript.rename.enabled"] = {default = true,description = "Enable rename functionality for JS/TS variables inside Astro files",title = "TypeScript: Rename",type = "boolean"},["astro.typescript.semanticTokens.enabled"] = {default = true,description = "Enable semantic tokens (used for semantic highlighting) for TypeScript.",title = "TypeScript: Semantic Tokens",type = "boolean"},["astro.typescript.signatureHelp.enabled"] = {default = true,description = "Enable signature help (parameter hints) for TypeScript",title = "TypeScript: Signature Help",type = "boolean"}},title = "Astro configuration",type = "object"} \ No newline at end of file
+return {properties = {["astro.css.completions.emmet"] = {default = true,description = "Enable Emmet completions for CSS",title = "CSS: Emmet Completions",type = "boolean"},["astro.css.completions.enabled"] = {default = true,description = "Enable completions for CSS",title = "CSS: Completions",type = "boolean"},["astro.css.documentColors.enabled"] = {default = true,description = "Enable color picker for CSS",title = "CSS: Document Colors",type = "boolean"},["astro.css.documentSymbols.enabled"] = {default = true,description = "Enable document symbols for CSS",title = "CSS: Symbols in Outline",type = "boolean"},["astro.css.enabled"] = {default = true,description = "Enable CSS features",title = "CSS",type = "boolean"},["astro.css.hover.enabled"] = {default = true,description = "Enable hover info for CSS",title = "CSS: Hover Info",type = "boolean"},["astro.format.indentFrontmatter"] = {default = false,description = "Indent the formatter by one level of indentation",title = "Formatting: Indent frontmatter",type = "boolean"},["astro.format.newLineAfterFrontmatter"] = {default = true,description = "Add a line return between the frontmatter and the template",title = "Formatting: Add line return after the frontmatter",type = "boolean"},["astro.html.completions.emmet"] = {default = true,description = "Enable Emmet completions for HTML",title = "HTML: Emmet Completions",type = "boolean"},["astro.html.completions.enabled"] = {default = true,description = "Enable completions for HTML",title = "HTML: Completions",type = "boolean"},["astro.html.documentSymbols.enabled"] = {default = true,description = "Enable document symbols for CSS",title = "HTML: Symbols in Outline",type = "boolean"},["astro.html.enabled"] = {default = true,description = "Enable HTML features",title = "HTML",type = "boolean"},["astro.html.hover.enabled"] = {default = true,description = "Enable hover info for HTML",title = "HTML: Hover Info",type = "boolean"},["astro.html.tagComplete.enabled"] = {default = true,description = "Enable tag completion for HTML",title = "HTML: Tag Completion",type = "boolean"},["astro.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["astro.typescript.allowArbitraryAttributes"] = {default = false,description = "Enable the usage of non-standard HTML attributes, such as the ones added by AlpineJS or petite-vue",title = "TypeScript: Allow arbitrary attributes on HTML elements",type = "boolean"},["astro.typescript.codeActions.enabled"] = {default = true,description = "Enable code actions for TypeScript",title = "TypeScript: Code Actions",type = "boolean"},["astro.typescript.completions.enabled"] = {default = true,description = "Enable completions for TypeScript",title = "TypeScript: Completions",type = "boolean"},["astro.typescript.definitions.enabled"] = {default = true,description = "Enable go to definition for TypeScript",title = "TypeScript: Go to Definition",type = "boolean"},["astro.typescript.diagnostics.enabled"] = {default = true,description = "Enable diagnostic messages for TypeScript",title = "TypeScript: Diagnostics",type = "boolean"},["astro.typescript.documentSymbols.enabled"] = {default = true,description = "Enable document symbols for TypeScript",title = "TypeScript: Symbols in Outline",type = "boolean"},["astro.typescript.enabled"] = {default = true,description = "Enable TypeScript features",title = "TypeScript",type = "boolean"},["astro.typescript.hover.enabled"] = {default = true,description = "Enable hover info for TypeScript",title = "TypeScript: Hover Info",type = "boolean"},["astro.typescript.rename.enabled"] = {default = true,description = "Enable rename functionality for JS/TS variables inside Astro files",title = "TypeScript: Rename",type = "boolean"},["astro.typescript.semanticTokens.enabled"] = {default = true,description = "Enable semantic tokens (used for semantic highlighting) for TypeScript.",title = "TypeScript: Semantic Tokens",type = "boolean"},["astro.typescript.signatureHelp.enabled"] = {default = true,description = "Enable signature help (parameter hints) for TypeScript",title = "TypeScript: Signature Help",type = "boolean"}},title = "Astro configuration",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/bashls.lua b/lua/mason/_generated/lsp-schemas/bash-language-server.lua
index 293d2dcd..293d2dcd 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/bashls.lua
+++ b/lua/mason/_generated/lsp-schemas/bash-language-server.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/clangd.lua b/lua/mason/_generated/lsp-schemas/clangd.lua
index d9147c25..d9147c25 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/clangd.lua
+++ b/lua/mason/_generated/lsp-schemas/clangd.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/denols.lua b/lua/mason/_generated/lsp-schemas/deno-lsp.lua
index 5ad46765..5ad46765 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/denols.lua
+++ b/lua/mason/_generated/lsp-schemas/deno-lsp.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/elixirls.lua b/lua/mason/_generated/lsp-schemas/elixir-ls.lua
index ab43558b..ab43558b 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/elixirls.lua
+++ b/lua/mason/_generated/lsp-schemas/elixir-ls.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/elmls.lua b/lua/mason/_generated/lsp-schemas/elm-language-server.lua
index 9d0d0c7e..9d0d0c7e 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/elmls.lua
+++ b/lua/mason/_generated/lsp-schemas/elm-language-server.lua
diff --git a/lua/mason/_generated/lsp-schemas/fsautocomplete.lua b/lua/mason/_generated/lsp-schemas/fsautocomplete.lua
new file mode 100644
index 00000000..72a08868
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/fsautocomplete.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["FAKE.showTargetsOutlineIn"] = {default = "explorer",description = "Set the activity (left bar) where the FAKE targets outline view will be displayed.\nRequires restart.",enum = { "explorer", "fsharp" },scope = "application",type = "string"},["FAKE.targetsOutline"] = {default = true,description = "Enables the Targets Outline tree view.",scope = "resource",type = "boolean"},["FSharp.abstractClassStubGeneration"] = {default = true,description = "Enables a codefix that generates missing members for an abstract class when in an type inheriting from that abstract class.",type = "boolean"},["FSharp.abstractClassStubGenerationMethodBody"] = {default = 'failwith "Not Implemented"',description = "The expression to fill in the right-hand side of inherited members when generating missing members for an abstract base class",type = "string"},["FSharp.abstractClassStubGenerationObjectIdentifier"] = {default = "this",description = "The name of the 'self' identifier in an inherited member. For example, `this` in the expression `this.Member(x: int) = ()`",type = "string"},["FSharp.addFsiWatcher"] = {default = false,description = "Enables a panel for FSI that shows the value of all existing bindings in the FSI session",type = "boolean"},["FSharp.analyzersPath"] = {default = { "packages/Analyzers", "analyzers" },description = "Directories in the array are used as a source of custom analyzers. Requires restart.",scope = "machine-overridable",type = "array"},["FSharp.autoRevealInExplorer"] = {default = "sameAsFileExplorer",description = "Controls whether the solution explorer should automatically reveal and select files when opening them. If `sameAsFileExplorer` is set, then the value of the `explorer.autoReveal` setting will be used instead.",enum = { "sameAsFileExplorer", "enabled", "disabled" },scope = "window",type = "string"},["FSharp.codeLenses.references.enabled"] = {default = true,description = "If enabled, code lenses for reference counts for methods and functions will be shown.",type = "boolean"},["FSharp.codeLenses.signature.enabled"] = {default = true,description = "If enabled, code lenses for type signatures on methods and functions will be shown.",type = "boolean"},["FSharp.disableFailedProjectNotifications"] = {default = false,description = "Disables popup notifications for failed project loading",type = "boolean"},["FSharp.dotnetRoot"] = {description = "Sets the root path for finding locating the dotnet CLI binary. Defaults to the `dotnet` binary found on your system PATH.",type = "string"},["FSharp.enableAnalyzers"] = {default = false,description = "EXPERIMENTAL. Enables F# analyzers for custom code diagnostics. Requires restart.",type = "boolean"},["FSharp.enableBackgroundServices"] = {default = true,description = "Enables background services responsible for creating symbol cache and typechecking files in the background. Requires restart.",type = "boolean"},["FSharp.enableMSBuildProjectGraph"] = {default = false,description = "EXPERIMENTAL. Enables support for loading workspaces with MsBuild's ProjectGraph. This can improve load times. Requires restart.",type = "boolean"},["FSharp.enableReferenceCodeLens"] = {default = true,deprecationMessage = "This setting is deprecated. Use FSharp.codeLenses.references.enabled instead.",description = "Enables additional code lenses showing number of references of a function or value. Requires background services to be enabled.",markdownDeprecationMessage = "This setting is **deprecated**. Use `#FSharp.codeLenses.references.enabled#` instead.",type = "boolean"},["FSharp.enableTouchBar"] = {default = true,description = "Enables TouchBar integration of build/run/debug buttons",type = "boolean"},["FSharp.enableTreeView"] = {default = true,description = "Enables the solution explorer view of the current workspace, which shows the workspace as MSBuild sees it",type = "boolean"},["FSharp.excludeProjectDirectories"] = {default = { ".git", "paket-files", ".fable", "packages", "node_modules" },description = "Directories in the array are excluded from project file search. Requires restart.",type = "array"},["FSharp.externalAutocomplete"] = {default = false,description = "Includes external (from unopened modules and namespaces) symbols in autocomplete",type = "boolean"},["FSharp.fsac.attachDebugger"] = {default = false,description = "Appends the '--attachdebugger' argument to fsac, this will allow you to attach a debugger.",type = "boolean"},["FSharp.fsac.dotnetArgs"] = {default = {},description = "additional CLI arguments to be provided to the dotnet runner for FSAC",items = {type = "string"},type = "array"},["FSharp.fsac.netCoreDllPath"] = {default = "",description = "The path to the 'fsautocomplete.dll', useful for debugging a self-built fsac.",scope = "machine-overridable",type = "string"},["FSharp.fsac.silencedLogs"] = {default = {},description = "An array of log categories for FSAC to filter out. These can be found by viewing your log output and noting the text in between the brackets in the log line. For example, in the log line `[16:07:14.626 INF] [Compiler] done compiling foo.fsx`, the category is 'Compiler'. ",items = {type = "string"},type = "array"},["FSharp.fsiExtraParameters"] = {default = {},markdownDescription = "An array of additional command line parameters to pass to FSI when it is started. See [the Microsoft documentation](https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/fsharp-interactive-options) for an exhaustive list.",type = "array"},["FSharp.fsiFilePath"] = {default = "",description = "The path to the F# Interactive tool used by Ionide-FSharp (.NET Framework only, on .NET Core `FSharp.fsiSdkFilePath` is used)",scope = "machine-overridable",type = "string"},["FSharp.fsiSdkFilePath"] = {default = "",description = "The path to the F# Interactive tool used by Ionide-FSharp (When using .NET SDK scripts)",scope = "machine-overridable",type = "string"},["FSharp.generateBinlog"] = {default = false,markdownDescription = "Enables generation of `msbuild.binlog` files for project loading. It works only for fresh, non-cached project loading. Run `F#: Clear Project Cache` and reload window to force fresh loading of all projects. These files can be loaded and inspected using the [MSBuild Structured Logger](https://github.com/KirillOsenkov/MSBuildStructuredLog)",type = "boolean"},["FSharp.indentationSize"] = {description = "The number of spaces used for indentation when generating code, e.g. for interface stubs",minimum = 0,type = "number"},["FSharp.infoPanelReplaceHover"] = {default = false,description = "Controls whether the info panel replaces tooltips",type = "boolean"},["FSharp.infoPanelShowOnStartup"] = {default = false,description = "Controls whether the info panel should be displayed at startup",type = "boolean"},["FSharp.infoPanelStartLocked"] = {default = false,description = "Controls whether the info panel should be locked at startup",type = "boolean"},["FSharp.infoPanelUpdate"] = {default = "onCursorMove",description = "Controls when the info panel is updated",enum = { "onCursorMove", "onHover", "both", "none" },type = "string"},["FSharp.inlayHints.disableLongTooltip"] = {default = false,description = "Hides the explanatory tooltip that appears on InlayHints to describe the different configuration toggles.",type = "boolean"},["FSharp.inlayHints.enabled"] = {default = true,description = "Controls if the inlay hints feature is enabled",type = "boolean"},["FSharp.inlayHints.parameterNames"] = {default = true,description = "Controls if parameter-name inlay hints will be displayed for functions and methods",type = "boolean"},["FSharp.inlayHints.typeAnnotations"] = {default = true,description = "Controls if type-annotation inlay hints will be displayed for bindings.",type = "boolean"},["FSharp.interfaceStubGeneration"] = {default = true,description = "Enables a codefix that generates missing interface members when inside of an interface implementation expression",type = "boolean"},["FSharp.interfaceStubGenerationMethodBody"] = {default = 'failwith "Not Implemented"',description = "The expression to fill in the right-hand side of interface members when generating missing members for an interface implementation expression",type = "string"},["FSharp.interfaceStubGenerationObjectIdentifier"] = {default = "this",description = "The name of the 'self' identifier in an interface member. For example, `this` in the expression `this.Member(x: int) = ()`",type = "string"},["FSharp.keywordsAutocomplete"] = {default = true,description = "Includes keywords in autocomplete",type = "boolean"},["FSharp.lineLens.enabled"] = {default = "replaceCodeLens",description = "Usage mode for LineLens. If `never`, LineLens will never be shown. If `replaceCodeLens`, LineLens will be placed in a decoration on top of the current line.",enum = { "never", "replaceCodeLens", "always" },type = "string"},["FSharp.lineLens.prefix"] = {default = " // ",description = "The prefix displayed before the signature in a LineLens",type = "string"},["FSharp.linter"] = {default = true,markdownDescription = "Enables integration with [FSharpLint](https://fsprojects.github.io/FSharpLint/) for additional (user-defined) warnings",type = "boolean"},["FSharp.msbuildAutoshow"] = {default = false,description = "Automatically shows the MSBuild output panel when MSBuild functionality is invoked",type = "boolean"},["FSharp.pipelineHints.enabled"] = {default = true,description = "Enables PipeLine hints, which are like LineLenses that appear along each step of a chain of piped expressions",type = "boolean"},["FSharp.pipelineHints.prefix"] = {default = " // ",description = "The prefix displayed before the signature",type = "string"},["FSharp.recordStubGeneration"] = {default = true,description = "Enables a codefix that will generate missing record fields when inside a record construction expression",type = "boolean"},["FSharp.recordStubGenerationBody"] = {default = 'failwith "Not Implemented"',description = "The expression to fill in the right-hand side of record fields when generating missing fields for a record construction expression",type = "string"},["FSharp.resolveNamespaces"] = {default = true,description = "Enables a codefix that will suggest namespaces or module to open when a name is not recognized",type = "boolean"},["FSharp.saveOnSendLastSelection"] = {default = false,description = "If enabled, the current file will be saved before sending the last selection to FSI for evaluation",type = "boolean"},["FSharp.showExplorerOnStartup"] = {default = true,description = "Automatically shows solution explorer on plugin startup",type = "boolean"},["FSharp.showProjectExplorerIn"] = {default = "fsharp",description = "Set the activity (left bar) where the project explorer view will be displayed. If `explorer`, then the project explorer will be a collapsible tab in the main explorer view, a sibling to the file system explorer. If `fsharp`, a new activity with the F# logo will be added and the project explorer will be rendered in this activity.Requires restart.",enum = { "explorer", "fsharp" },scope = "application",type = "string"},["FSharp.simplifyNameAnalyzer"] = {default = true,description = "Enables detection of cases when names of functions and values can be simplified",type = "boolean"},["FSharp.smartIndent"] = {default = false,description = "Enables smart indent feature",type = "boolean"},["FSharp.suggestGitignore"] = {default = true,description = "Allow Ionide to prompt whenever internal data files aren't included in your project's .gitignore",type = "boolean"},["FSharp.suggestSdkScripts"] = {default = true,description = "Allow Ionide to prompt to use SdkScripts",type = "boolean"},["FSharp.trace.server"] = {default = "off",description = "Trace server messages at the LSP protocol level for diagnostics.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["FSharp.unionCaseStubGeneration"] = {default = true,description = "Enables a codefix that generates missing union cases when in a match expression",type = "boolean"},["FSharp.unionCaseStubGenerationBody"] = {default = 'failwith "Not Implemented"',description = "The expression to fill in the right-hand side of match cases when generating missing cases for a match on a discriminated union",type = "string"},["FSharp.unusedDeclarationsAnalyzer"] = {default = true,description = "Enables detection of unused declarations",type = "boolean"},["FSharp.unusedOpensAnalyzer"] = {default = true,description = "Enables detection of unused opens",type = "boolean"},["FSharp.useSdkScripts"] = {default = true,description = "Use 'dotnet fsi' instead of 'fsi.exe'/'fsharpi' to start an FSI session",type = "boolean"},["FSharp.verboseLogging"] = {default = false,description = "Logs additional information to F# output channel. This is equivalent to passing the `--verbose` flag to FSAC. Requires restart.",type = "boolean"},["FSharp.workspaceModePeekDeepLevel"] = {default = 4,description = "The deep level of directory hierarchy when searching for sln/projects",type = "integer"},["FSharp.workspacePath"] = {description = "Path to the directory or solution file that should be loaded as a workspace. If set, no workspace probing or discovery is done by Ionide at all.",scope = "window",type = "string"}},title = "F#",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/grammarly.lua b/lua/mason/_generated/lsp-schemas/grammarly-languageserver.lua
index d1063c86..d1063c86 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/grammarly.lua
+++ b/lua/mason/_generated/lsp-schemas/grammarly-languageserver.lua
diff --git a/lua/mason/_generated/lsp-schemas/haxe-language-server.lua b/lua/mason/_generated/lsp-schemas/haxe-language-server.lua
new file mode 100644
index 00000000..c8c4adfc
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/haxe-language-server.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["haxe.buildCompletionCache"] = {default = true,markdownDescription = "Speed up completion by building the project once on startup to initialize the cache.",type = "boolean"},["haxe.codeGeneration"] = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Options for code generation",properties = {functions = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Options for generating functions",properties = {anonymous = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Options for generating anonymous functions",properties = {argumentTypeHints = {default = false,markdownDescription = "Whether to include type hints for arguments",type = "boolean"},explicitNull = {default = false,markdownDescription = "Whether to wrap types in `Null<T>` even if it can be omitted (for optional arguments with `?`)",type = "boolean"},returnTypeHint = {default = "never",enum = { "always", "never", "non-void" },markdownDescription = "In which case to include return type hints",type = "string"},useArrowSyntax = {default = true,markdownDescription = "Whether to use arrow function syntax (Haxe 4+)",type = "boolean"}},type = "object"},field = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Options for generating field-level functions",properties = {argumentTypeHints = {default = true,markdownDescription = "Whether to include type hints for arguments",type = "boolean"},explicitNull = {default = false,markdownDescription = "Whether to wrap types in `Null<T>` even if it can be omitted (for optional arguments with `?`)",type = "boolean"},explicitPrivate = {default = false,markdownDescription = "Whether to include the private visibility modifier even if it can be omitted",type = "boolean"},explicitPublic = {default = false,markdownDescription = "Whether to include the public visibility modifier even if it can be omitted",type = "boolean"},placeOpenBraceOnNewLine = {default = false,markdownDescription = "Whether to place `{` in a new line",type = "boolean"},returnTypeHint = {default = "non-void",enum = { "always", "never", "non-void" },markdownDescription = "In which case to include return type hints",type = "string"}},type = "object"}},type = "object"},imports = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Options for generating imports",properties = {enableAutoImports = {default = true,markdownDescription = "Whether to insert an import automatically when selecting a not-yet-imported type from completion. If `false`, the fully qualified name is inserted instead.",type = "boolean"},style = {default = "type",enum = { "type", "module" },markdownDescription = "How to deal with module subtypes when generating imports.",markdownEnumDescriptions = { "Import only the specific sub-type (`import pack.Foo.Type`).", "Import the entire module the sub-type lives in (`import pack.Foo`)." },type = "string"}},type = "object"},switch = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Options for generating switch expressions",properties = {parentheses = {default = false,markdownDescription = "Whether to wrap the switch subject in parentheses",type = "boolean"}},type = "object"}},type = "object"},["haxe.configurations"] = {default = {},items = {markdownDescription = "Command-line arguments passed to the Haxe completion server. Can contain HXML files. Relative paths will be resolved against workspace root.",oneOf = { {items = {type = "string"},type = "array"}, {additionalProperties = false,properties = {args = {items = {type = "string"},markdownDescription = "The Haxe command-line arguments.",type = "array"},label = {markdownDescription = "The label to use for displaying this configuration in the UI.",type = "string"}},type = "object"} }},markdownDescription = "Array of switchable configurations for the Haxe completion server. Each configuration is an array of command-line arguments, see item documentation for more details.",type = "array"},["haxe.diagnosticsPathFilter"] = {default = "${workspaceRoot}",markdownDescription = 'A regex that paths of source files have to match to be included in diagnostics. Defaults to `"${workspaceRoot}"` so only files within your workspace are included. You can use `"${haxelibPath}/<library-name>"` to only show results for a specific haxelib. Use `".*?"` to see all results, including haxelibs.',type = "string"},["haxe.displayConfigurations"] = {default = {},deprecationMessage = 'Use "haxe.configurations" instead',type = "array"},["haxe.displayPort"] = {default = "auto",markdownDescription = 'Integer value for the port to open on the display server, or `"auto"`. Can be used to `--connect` Haxe build commands.',oneOf = { {type = "integer"}, {enum = { "auto" },type = "string"} }},["haxe.displayServer"] = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Haxe completion server configuration",properties = {arguments = {default = {},items = {type = "string"},markdownDescription = 'Array of arguments passed to the Haxe completion server at start. Can be used for debugging completion server issues, for example by adding the `"-v"` argument.',type = "array"},print = {additionalProperties = false,default = {completion = false,reusing = false},markdownDescription = "Which debug output to print to the Haxe output channel. With `-v`, all flags default to `true`, and without it to `false`. Setting a flag here overrides the default. Only works with Haxe 4.0.0-preview.4 or newer.",properties = {addedDirectory = {type = "boolean"},arguments = {type = "boolean"},cachedModules = {type = "boolean"},changedDirectories = {type = "boolean"},completion = {type = "boolean"},defines = {type = "boolean"},displayPosition = {type = "boolean"},foundDirectories = {type = "boolean"},message = {type = "boolean"},modulePathChanged = {type = "boolean"},newContext = {type = "boolean"},notCached = {type = "boolean"},parsed = {type = "boolean"},removedDirectory = {type = "boolean"},reusing = {type = "boolean"},signature = {type = "boolean"},skippingDep = {type = "boolean"},socketMessage = {type = "boolean"},stats = {type = "boolean"},uncaughtError = {type = "boolean"},unchangedContent = {type = "boolean"}},type = "object"},useSocket = {default = true,markdownDescription = "If possible, use a socket for communication with Haxe rather than stdio.",type = "boolean"}},type = "object"},["haxe.enableBraceBodyWrapping"] = {default = false,markdownDescription = "Add closing brace at the end of one-line `if/for/while` body expressions",type = "boolean"},["haxe.enableCodeLens"] = {default = false,markdownDescription = "Enable code lens to show some statistics",type = "boolean"},["haxe.enableCompilationServer"] = {default = true,markdownDescription = "Use the extension's Haxe server to compile auto-generated tasks. Requires `\"haxe.displayPort\"` to be set.",type = "boolean"},["haxe.enableCompletionCacheWarning"] = {default = true,markdownDescription = "Whether a warning popup should be shown if the completion cache build has failed.",type = "boolean"},["haxe.enableDiagnostics"] = {default = true,markdownDescription = "Enable automatic diagnostics of Haxe files, run automatically on open and save.",type = "boolean"},["haxe.enableExtendedIndentation"] = {default = false,markdownDescription = "Align new line brackets with Allman style. Can have typing overhead and is incompatible with the Vim extension.",type = "boolean"},["haxe.enableMethodsView"] = {default = false,deprecationMessage = 'Use "haxe.enableServerView" instead',type = "boolean"},["haxe.enableServerView"] = {default = false,markdownDescription = 'Enable the "Haxe Server" view container for performance and cache debugging.',type = "boolean"},["haxe.enableSignatureHelpDocumentation"] = {default = true,markdownDescription = "Whether signature help should include documentation or not.",type = "boolean"},["haxe.exclude"] = {default = { "zpp_nape" },markdownDescription = "A list of dot paths (packages, modules, types) to exclude from classpath parsing, completion and workspace symbols. Can be useful to improve performance.",type = "array"},["haxe.executable"] = {default = "auto",markdownDescription = "Path to the Haxe executable or an object containing a Haxe executable configuration",oneOf = { {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxe executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxe executable",type = "string"}, {additionalProperties = false,markdownDescription = "Haxe executable configuration",properties = {env = {additionalProperties = {type = "string"},default = vim.empty_dict(),markdownDescription = "Additional environment variables used for running Haxe executable",type = "object"},linux = {default = "auto",markdownDescription = "Linux-specific path to the Haxe executable or an object containing a Haxe executable configuration",oneOf = { {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxe executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxe executable",type = "string"}, {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Overrides for Linux",properties = {env = {additionalProperties = {type = "string"},default = vim.empty_dict(),markdownDescription = "Additional environment variables used for running Haxe executable",type = "object"},path = {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxe executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxe executable",type = "string"}},type = "object"} }},osx = {default = "auto",markdownDescription = "Mac-specific path to the Haxe executable or an object containing a Haxe executable configuration",oneOf = { {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxe executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxe executable",type = "string"}, {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Overrides for Mac",properties = {env = {additionalProperties = {type = "string"},default = vim.empty_dict(),markdownDescription = "Additional environment variables used for running Haxe executable",type = "object"},path = {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxe executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxe executable",type = "string"}},type = "object"} }},path = {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxe executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxe executable",type = "string"},windows = {default = "auto",markdownDescription = "Windows-specific path to the Haxe executable or an object containing a Haxe executable configuration",oneOf = { {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxe executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxe executable",type = "string"}, {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Overrides for Windows",properties = {env = {additionalProperties = {type = "string"},default = vim.empty_dict(),markdownDescription = "Additional environment variables used for running Haxe executable",type = "object"},path = {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxe executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxe executable",type = "string"}},type = "object"} }}},type = "object"} },scope = "resource"},["haxe.maxCompletionItems"] = {default = 1000,markdownDescription = "Upper limit for the number of completion items that can be shown at once.",type = "integer"},["haxe.postfixCompletion"] = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "Options for postfix completion",properties = {level = {default = "full",enum = { "full", "filtered", "off" },markdownDescription = "Which kinds of postfix completions to include",markdownEnumDescriptions = { "Show all postfix completion items.", "Only show items that apply to specific types like `for` and `switch`.", "Disable postfix completion." },type = "string"}},type = "object"},["haxe.taskPresentation"] = {additionalProperties = false,default = {clear = false,echo = true,focus = false,panel = "shared",reveal = "always",showReuseMessage = true},markdownDescription = "Configures which presentation options to use for generated tasks by default (see `presentation` in `tasks.json`).",properties = {clear = {default = false,markdownDescription = "Controls whether the terminal is cleared before executing the task.",type = "boolean"},echo = {default = true,markdownDescription = "Controls whether the executed command is echoed to the panel. Default is `true`.",type = "boolean"},focus = {default = false,markdownDescription = "Controls whether the panel takes focus. Default is `false`. If set to `true` the panel is revealed as well.",type = "boolean"},panel = {default = "shared",enum = { "shared", "dedicated", "new" },markdownDescription = "Controls if the panel is shared between tasks, dedicated to this task or a new one is created on every run.",type = "string"},reveal = {default = "always",enum = { "always", "silent", "never" },markdownDescription = 'Controls whether the panel running the task is revealed or not. Default is `"always"`.',markdownEnumDescriptions = { "Always reveals the terminal when this task is executed.", "Only reveals the terminal if no problem matcher is associated with the task and an errors occurs executing it.", "Never reveals the terminal when this task is executed." },type = "string"},showReuseMessage = {default = true,markdownDescription = "Controls whether to show the `Terminal will be reused by tasks, press any key to close it` message.",type = "boolean"}},type = "object"},["haxe.useLegacyCompletion"] = {default = false,markdownDescription = "Whether to revert to a Haxe 3 style completion where only toplevel packages and imported types are shown (effectively making it incompatible with auto-imports). *Note:* this setting has no effect with Haxe versions earlier than 4.0.0-rc.4.",type = "boolean"},["haxelib.executable"] = {anyOf = { {enum = { "auto" },markdownEnumDescriptions = { "Auto-detect the Haxelib executable." },type = "string"}, {type = "string"} },default = "auto",markdownDescription = "Path to the Haxelib executable",scope = "resource",type = "string"}},title = "Haxe"} \ No newline at end of file
diff --git a/lua/mason/_generated/lsp-schemas/html-lsp.lua b/lua/mason/_generated/lsp-schemas/html-lsp.lua
new file mode 100644
index 00000000..605ccb49
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/html-lsp.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {id = "html",order = 20,properties = {["html.autoClosingTags"] = {default = true,description = "%html.autoClosingTags%",scope = "resource",type = "boolean"},["html.autoCreateQuotes"] = {default = true,description = "%html.autoCreateQuotes%",scope = "resource",type = "boolean"},["html.completion.attributeDefaultValue"] = {default = "doublequotes",description = "%html.completion.attributeDefaultValue%",enum = { "doublequotes", "singlequotes", "empty" },enumDescriptions = { "%html.completion.attributeDefaultValue.doublequotes%", "%html.completion.attributeDefaultValue.singlequotes%", "%html.completion.attributeDefaultValue.empty%" },scope = "resource",type = "string"},["html.customData"] = {default = {},items = {type = "string"},markdownDescription = "%html.customData.desc%",scope = "resource",type = "array"},["html.format.contentUnformatted"] = {default = "pre,code,textarea",markdownDescription = "%html.format.contentUnformatted.desc%",scope = "resource",type = { "string", "null" }},["html.format.enable"] = {default = true,description = "%html.format.enable.desc%",scope = "window",type = "boolean"},["html.format.extraLiners"] = {default = "head, body, /html",markdownDescription = "%html.format.extraLiners.desc%",scope = "resource",type = { "string", "null" }},["html.format.indentHandlebars"] = {default = false,markdownDescription = "%html.format.indentHandlebars.desc%",scope = "resource",type = "boolean"},["html.format.indentInnerHtml"] = {default = false,markdownDescription = "%html.format.indentInnerHtml.desc%",scope = "resource",type = "boolean"},["html.format.maxPreserveNewLines"] = {default = vim.NIL,markdownDescription = "%html.format.maxPreserveNewLines.desc%",scope = "resource",type = { "number", "null" }},["html.format.preserveNewLines"] = {default = true,description = "%html.format.preserveNewLines.desc%",scope = "resource",type = "boolean"},["html.format.templating"] = {default = false,description = "%html.format.templating.desc%",scope = "resource",type = "boolean"},["html.format.unformatted"] = {default = "wbr",markdownDescription = "%html.format.unformatted.desc%",scope = "resource",type = { "string", "null" }},["html.format.unformattedContentDelimiter"] = {default = "",markdownDescription = "%html.format.unformattedContentDelimiter.desc%",scope = "resource",type = "string"},["html.format.wrapAttributes"] = {default = "auto",description = "%html.format.wrapAttributes.desc%",enum = { "auto", "force", "force-aligned", "force-expand-multiline", "aligned-multiple", "preserve", "preserve-aligned" },enumDescriptions = { "%html.format.wrapAttributes.auto%", "%html.format.wrapAttributes.force%", "%html.format.wrapAttributes.forcealign%", "%html.format.wrapAttributes.forcemultiline%", "%html.format.wrapAttributes.alignedmultiple%", "%html.format.wrapAttributes.preserve%", "%html.format.wrapAttributes.preservealigned%" },scope = "resource",type = "string"},["html.format.wrapAttributesIndentSize"] = {default = vim.NIL,markdownDescription = "%html.format.wrapAttributesIndentSize.desc%",scope = "resource",type = { "number", "null" }},["html.format.wrapLineLength"] = {default = 120,description = "%html.format.wrapLineLength.desc%",scope = "resource",type = "integer"},["html.hover.documentation"] = {default = true,description = "%html.hover.documentation%",scope = "resource",type = "boolean"},["html.hover.references"] = {default = true,description = "%html.hover.references%",scope = "resource",type = "boolean"},["html.mirrorCursorOnMatchingTag"] = {default = false,deprecationMessage = "%html.mirrorCursorOnMatchingTagDeprecationMessage%",description = "%html.mirrorCursorOnMatchingTag%",scope = "resource",type = "boolean"},["html.suggest.html5"] = {default = true,description = "%html.suggest.html5.desc%",scope = "resource",type = "boolean"},["html.trace.server"] = {default = "off",description = "%html.trace.server.desc%",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["html.validate.scripts"] = {default = true,description = "%html.validate.scripts%",scope = "resource",type = "boolean"},["html.validate.styles"] = {default = true,description = "%html.validate.styles%",scope = "resource",type = "boolean"}},title = "HTML",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/intelephense.lua b/lua/mason/_generated/lsp-schemas/intelephense.lua
index 10d4a5c7..10d4a5c7 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/intelephense.lua
+++ b/lua/mason/_generated/lsp-schemas/intelephense.lua
diff --git a/lua/mason/_generated/lsp-schemas/jdtls.lua b/lua/mason/_generated/lsp-schemas/jdtls.lua
new file mode 100644
index 00000000..4c25a7bc
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/jdtls.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["java.autobuild.enabled"] = {default = true,description = "Enable/disable the 'auto build'",scope = "window",type = "boolean"},["java.codeGeneration.generateComments"] = {default = false,description = "Generate method comments when generating the methods.",scope = "window",type = "boolean"},["java.codeGeneration.hashCodeEquals.useInstanceof"] = {default = false,description = "Use 'instanceof' to compare types when generating the hashCode and equals methods.",scope = "window",type = "boolean"},["java.codeGeneration.hashCodeEquals.useJava7Objects"] = {default = false,description = "Use Objects.hash and Objects.equals when generating the hashCode and equals methods. This setting only applies to Java 7 and higher.",scope = "window",type = "boolean"},["java.codeGeneration.insertionLocation"] = {default = "afterCursor",description = "Specifies the insertion location of the code generated by source actions.",enum = { "afterCursor", "beforeCursor", "lastMember" },enumDescriptions = { "Insert the generated code after the member where the cursor is located.", "Insert the generated code before the member where the cursor is located.", "Insert the generated code as the last member of the target type." },scope = "window",type = "string"},["java.codeGeneration.toString.codeStyle"] = {default = "STRING_CONCATENATION",description = "The code style for generating the toString method.",enum = { "STRING_CONCATENATION", "STRING_BUILDER", "STRING_BUILDER_CHAINED", "STRING_FORMAT" },enumDescriptions = { "String concatenation", "StringBuilder/StringBuffer", "StringBuilder/StringBuffer - chained call", "String.format/MessageFormat" },type = "string"},["java.codeGeneration.toString.limitElements"] = {default = 0,description = "Limit number of items in arrays/collections/maps to list, if 0 then list all.",scope = "window",type = "integer"},["java.codeGeneration.toString.listArrayContents"] = {default = true,description = "List contents of arrays instead of using native toString().",scope = "window",type = "boolean"},["java.codeGeneration.toString.skipNullValues"] = {default = false,description = "Skip null values when generating the toString method.",scope = "window",type = "boolean"},["java.codeGeneration.toString.template"] = {default = "${object.className} [${member.name()}=${member.value}, ${otherMembers}]",description = "The template for generating the toString method.",type = "string"},["java.codeGeneration.useBlocks"] = {default = false,description = "Use blocks in 'if' statements when generating the methods.",scope = "window",type = "boolean"},["java.completion.enabled"] = {default = true,description = "Enable/disable code completion support",scope = "window",type = "boolean"},["java.completion.favoriteStaticMembers"] = {default = { "org.junit.Assert.*", "org.junit.Assume.*", "org.junit.jupiter.api.Assertions.*", "org.junit.jupiter.api.Assumptions.*", "org.junit.jupiter.api.DynamicContainer.*", "org.junit.jupiter.api.DynamicTest.*", "org.mockito.Mockito.*", "org.mockito.ArgumentMatchers.*", "org.mockito.Answers.*" },description = "Defines a list of static members or types with static members. Content assist will propose those static members even if the import is missing.",scope = "window",type = "array"},["java.completion.filteredTypes"] = {default = { "java.awt.*", "com.sun.*", "sun.*", "jdk.*", "org.graalvm.*", "io.micrometer.shaded.*" },description = "Defines the type filters. All types whose fully qualified name matches the selected filter strings will be ignored in content assist or quick fix proposals and when organizing imports. For example 'java.awt.*' will hide all types from the awt packages.",scope = "window",type = "array"},["java.completion.guessMethodArguments"] = {default = false,description = "When set to true, method arguments are guessed when a method is selected from as list of code assist proposals.",scope = "window",type = "boolean"},["java.completion.importOrder"] = {default = { "java", "javax", "org", "com" },description = "Defines the sorting order of import statements. A package or type name prefix (e.g. 'org.eclipse') is a valid entry. An import is always added to the most specific group.",scope = "window",type = "array"},["java.completion.maxResults"] = {default = 0,markdownDescription = "Maximum number of completion results (not including snippets).\n`0` (the default value) disables the limit, all results are returned. In case of performance problems, consider setting a sensible limit.",scope = "window",type = "integer"},["java.configuration.checkProjectSettingsExclusions"] = {default = false,deprecationMessage = "Please use 'java.import.generatesMetadataFilesAtProjectRoot' to control whether to generate the project metadata files at the project root. And use 'files.exclude' to control whether to hide the project metadata files from the file explorer.",description = "Controls whether to exclude extension-generated project settings files (.project, .classpath, .factorypath, .settings/) from the file explorer.",scope = "window",type = "boolean"},["java.configuration.maven.globalSettings"] = {default = vim.NIL,description = "Path to Maven's global settings.xml",scope = "window",type = "string"},["java.configuration.maven.notCoveredPluginExecutionSeverity"] = {default = "warning",description = "Specifies severity if the plugin execution is not covered by Maven build lifecycle.",enum = { "ignore", "warning", "error" },scope = "window",type = "string"},["java.configuration.maven.userSettings"] = {default = vim.NIL,description = "Path to Maven's user settings.xml",scope = "window",type = "string"},["java.configuration.runtimes"] = {default = {},description = "Map Java Execution Environments to local JDKs.",items = {additionalProperties = false,default = vim.empty_dict(),properties = {default = {description = "Is default runtime? Only one runtime can be default.",type = "boolean"},javadoc = {description = "JDK javadoc path.",type = "string"},name = {description = "Java Execution Environment name. Must be unique.",enum = { "J2SE-1.5", "JavaSE-1.6", "JavaSE-1.7", "JavaSE-1.8", "JavaSE-9", "JavaSE-10", "JavaSE-11", "JavaSE-12", "JavaSE-13", "JavaSE-14", "JavaSE-15", "JavaSE-16", "JavaSE-17", "JavaSE-18" },type = "string"},path = {description = 'JDK home path. Should be the JDK installation directory, not the Java bin path.\n On Windows, backslashes must be escaped, i.e.\n"path":"C:\\\\Program Files\\\\Java\\\\jdk1.8.0_161".',pattern = ".*(?<!\\/bin|\\/bin\\/|\\\\bin|\\\\bin\\\\)$",type = "string"},sources = {description = "JDK sources path.",type = "string"}},required = { "path", "name" },type = "object"},scope = "machine-overridable",type = "array"},["java.configuration.updateBuildConfiguration"] = {default = "interactive",description = "Specifies how modifications on build files update the Java classpath/configuration",enum = { "disabled", "interactive", "automatic" },scope = "window",type = { "string" }},["java.configuration.workspaceCacheLimit"] = {default = 90,description = "The number of days (if enabled) to keep unused workspace cache data. Beyond this limit, cached workspace data may be removed.",minimum = 1,scope = "application",type = { "null", "integer" }},["java.contentProvider.preferred"] = {default = vim.NIL,description = "Preferred content provider (a 3rd party decompiler id, usually)",scope = "window",type = "string"},["java.eclipse.downloadSources"] = {default = false,description = "Enable/disable download of Maven source artifacts for Eclipse projects.",scope = "window",type = "boolean"},["java.errors.incompleteClasspath.severity"] = {default = "warning",description = "Specifies the severity of the message when the classpath is incomplete for a Java file",enum = { "ignore", "info", "warning", "error" },scope = "window",type = { "string" }},["java.foldingRange.enabled"] = {default = true,description = "Enable/disable smart folding range support. If disabled, it will use the default indentation-based folding range provided by VS Code.",scope = "window",type = "boolean"},["java.format.comments.enabled"] = {default = true,description = "Includes the comments during code formatting.",scope = "window",type = "boolean"},["java.format.enabled"] = {default = true,description = "Enable/disable default Java formatter",scope = "window",type = "boolean"},["java.format.onType.enabled"] = {default = true,description = "Enable/disable automatic block formatting when typing `;`, `<enter>` or `}`",scope = "window",type = "boolean"},["java.format.settings.profile"] = {default = vim.NIL,description = "Optional formatter profile name from the Eclipse formatter settings.",scope = "window",type = "string"},["java.format.settings.url"] = {default = vim.NIL,markdownDescription = "Specifies the url or file path to the [Eclipse formatter xml settings](https://github.com/redhat-developer/vscode-java/wiki/Formatter-settings).",scope = "window",type = "string"},["java.home"] = {default = vim.NIL,deprecationMessage = "This setting is deprecated, please use 'java.jdt.ls.java.home' instead.",description = 'Specifies the folder path to the JDK (17 or more recent) used to launch the Java Language Server.\nOn Windows, backslashes must be escaped, i.e.\n"java.home":"C:\\\\Program Files\\\\Java\\\\jdk-17.0_3"',scope = "machine-overridable",type = { "string", "null" }},["java.implementationsCodeLens.enabled"] = {default = false,description = "Enable/disable the implementations code lens.",scope = "window",type = "boolean"},["java.import.exclusions"] = {default = { "**/node_modules/**", "**/.metadata/**", "**/archetype-resources/**", "**/META-INF/maven/**" },description = "Configure glob patterns for excluding folders. Use `!` to negate patterns to allow subfolders imports. You have to include a parent directory. The order is important.",scope = "window",type = "array"},["java.import.generatesMetadataFilesAtProjectRoot"] = {default = false,markdownDescription = "Specify whether the project metadata files(.project, .classpath, .factorypath, .settings/) will be generated at the project root. Click [HERE](command:_java.metadataFilesGeneration) to learn how to change the setting to make it take effect.",scope = "window",type = "boolean"},["java.import.gradle.arguments"] = {default = vim.NIL,description = "Arguments to pass to Gradle.",scope = "machine",type = "string"},["java.import.gradle.enabled"] = {default = true,description = "Enable/disable the Gradle importer.",scope = "window",type = "boolean"},["java.import.gradle.home"] = {default = vim.NIL,description = "Use Gradle from the specified local installation directory or GRADLE_HOME if the Gradle wrapper is missing or disabled and no 'java.import.gradle.version' is specified.",scope = "window",type = "string"},["java.import.gradle.java.home"] = {default = vim.NIL,description = "The location to the JVM used to run the Gradle daemon.",scope = "machine",type = "string"},["java.import.gradle.jvmArguments"] = {default = vim.NIL,description = "JVM arguments to pass to Gradle.",scope = "machine",type = "string"},["java.import.gradle.offline.enabled"] = {default = false,description = "Enable/disable the Gradle offline mode.",scope = "window",type = "boolean"},["java.import.gradle.user.home"] = {default = vim.NIL,description = "Setting for GRADLE_USER_HOME.",scope = "window",type = "string"},["java.import.gradle.version"] = {default = vim.NIL,description = "Use Gradle from the specific version if the Gradle wrapper is missing or disabled.",scope = "window",type = "string"},["java.import.gradle.wrapper.enabled"] = {default = true,description = "Use Gradle from the 'gradle-wrapper.properties' file.",scope = "window",type = "boolean"},["java.import.maven.enabled"] = {default = true,description = "Enable/disable the Maven importer.",scope = "window",type = "boolean"},["java.imports.gradle.wrapper.checksums"] = {default = {},description = "Defines allowed/disallowed SHA-256 checksums of Gradle Wrappers",items = {additionalProperties = false,default = vim.empty_dict(),properties = {allowed = {default = true,label = "Is allowed?",type = "boolean"},sha256 = {label = "SHA-256 checksum.",type = "string"}},required = { "sha256" },type = "object",uniqueItems = true},scope = "application",type = "array"},["java.inlayHints.parameterNames.enabled"] = {default = "literals",enum = { "none", "literals", "all" },enumDescriptions = { "Disable parameter name hints", "Enable parameter name hints only for literal arguments", "Enable parameter name hints for literal and non-literal arguments" },markdownDescription = "Enable/disable inlay hints for parameter names:\n```java\n\nInteger.valueOf(/* s: */ '123', /* radix: */ 10)\n \n```\n `#java.inlayHints.parameterNames.exclusions#` can be used to disable the inlay hints for methods.",scope = "window",type = "string"},["java.inlayHints.parameterNames.exclusions"] = {default = {},items = {type = "string"},markdownDescription = "The patterns for the methods that will be disabled to show the inlay hints. Supported pattern examples:\n - `java.lang.Math.*` - All the methods from java.lang.Math.\n - `*.Arrays.asList` - Methods named as 'asList' in the types named as 'Arrays'.\n - `*.println(*)` - Methods named as 'println'.\n - `(from, to)` - Methods with two parameters named as 'from' and 'to'.\n - `(arg*)` - Methods with one parameter whose name starts with 'arg'.",scope = "window",type = "array"},["java.jdt.ls.java.home"] = {default = vim.NIL,description = "Specifies the folder path to the JDK (17 or more recent) used to launch the Java Language Server. This setting will replace the Java extension's embedded JRE to start the Java Language Server. \n\nOn Windows, backslashes must be escaped, i.e.\n\"java.jdt.ls.java.home\":\"C:\\\\Program Files\\\\Java\\\\jdk-17.0_3\"",scope = "machine-overridable",type = { "string", "null" }},["java.jdt.ls.lombokSupport.enabled"] = {default = true,description = "Whether to load lombok processors from project classpath",scope = "window",type = "boolean"},["java.jdt.ls.vmargs"] = {default = "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m",description = "Specifies extra VM arguments used to launch the Java Language Server. Eg. use `-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m ` to optimize memory usage with the parallel garbage collector",scope = "machine-overridable",type = { "string", "null" }},["java.maven.downloadSources"] = {default = false,description = "Enable/disable download of Maven source artifacts as part of importing Maven projects.",scope = "window",type = "boolean"},["java.maven.updateSnapshots"] = {default = false,description = "Force update of Snapshots/Releases.",scope = "window",type = "boolean"},["java.maxConcurrentBuilds"] = {default = 1,description = "Max simultaneous project builds",minimum = 1,scope = "window",type = "integer"},["java.progressReports.enabled"] = {default = true,description = "[Experimental] Enable/disable progress reports from background processes on the server.",scope = "window",type = "boolean"},["java.project.encoding"] = {default = "ignore",enum = { "ignore", "warning", "setDefault" },enumDescriptions = { "Ignore project encoding settings", "Show warning if a project has no explicit encoding set", "Set the default workspace encoding settings" },markdownDescription = "Project encoding settings",scope = "window"},["java.project.importHint"] = {default = true,description = "Enable/disable the server-mode switch information, when Java projects import is skipped on startup.",scope = "application",type = "boolean"},["java.project.importOnFirstTimeStartup"] = {default = "automatic",description = "Specifies whether to import the Java projects, when opening the folder in Hybrid mode for the first time.",enum = { "disabled", "interactive", "automatic" },scope = "application",type = "string"},["java.project.outputPath"] = {default = "",markdownDescription = "A relative path to the workspace where stores the compiled output. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project.",scope = "window",type = { "string", "null" }},["java.project.referencedLibraries"] = {additionalProperties = false,default = { "lib/**/*.jar" },description = "Configure glob patterns for referencing local libraries to a Java project.",properties = {exclude = {type = "array"},include = {type = "array"},sources = {type = "object"}},required = { "include" },scope = "window",type = { "array", "object" }},["java.project.resourceFilters"] = {default = { "node_modules", ".git" },description = "Excludes files and folders from being refreshed by the Java Language Server, which can improve the overall performance. For example, [\"node_modules\",\".git\"] will exclude all files and folders named 'node_modules' or '.git'. Defaults to [\"node_modules\",\".git\"].",scope = "window",type = "array"},["java.project.sourcePaths"] = {default = {},items = {type = "string"},markdownDescription = "Relative paths to the workspace where stores the source files. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project.",scope = "window",type = "array"},["java.quickfix.showAt"] = {default = "line",description = "Show quickfixes at the problem or line level.",enum = { "line", "problem" },scope = "window",type = "string"},["java.recommendations.dependency.analytics.show"] = {default = true,description = "Show the recommended Dependency Analytics extension.",scope = "window",type = "boolean"},["java.references.includeAccessors"] = {default = true,description = "Include getter, setter and builder/constructor when finding references.",scope = "window",type = "boolean"},["java.references.includeDecompiledSources"] = {default = true,description = "Include the decompiled sources when finding references.",scope = "window",type = "boolean"},["java.referencesCodeLens.enabled"] = {default = false,description = "Enable/disable the references code lens.",scope = "window",type = "boolean"},["java.saveActions.organizeImports"] = {default = false,description = "Enable/disable auto organize imports on save action",scope = "window",type = "boolean"},["java.selectionRange.enabled"] = {default = true,description = "Enable/disable Smart Selection support for Java. Disabling this option will not affect the VS Code built-in word-based and bracket-based smart selection.",scope = "window",type = "boolean"},["java.server.launchMode"] = {default = "Hybrid",description = "The launch mode for the Java extension",enum = { "Standard", "LightWeight", "Hybrid" },enumDescriptions = { "Provides full features such as intellisense, refactoring, building, Maven/Gradle support etc.", "Starts a syntax server with lower start-up cost. Only provides syntax features such as outline, navigation, javadoc, syntax errors.", "Provides full features with better responsiveness. It starts a standard language server and a secondary syntax server. The syntax server provides syntax features until the standard server is ready." },scope = "window",type = "string"},["java.settings.url"] = {default = vim.NIL,markdownDescription = "Specifies the url or file path to the workspace Java settings. See [Setting Global Preferences](https://github.com/redhat-developer/vscode-java/wiki/Settings-Global-Preferences)",scope = "window",type = "string"},["java.showBuildStatusOnStart.enabled"] = {anyOf = { {enum = { "notification", "terminal", "off" },enumDescriptions = { "Show the build status via progress notification on start", "Show the build status via terminal on start", "Do not show any build status on start" }}, "boolean" },default = "notification",description = "Automatically show build status on startup.",scope = "window"},["java.signatureHelp.description.enabled"] = {default = false,description = "Enable/disable to show the description in signature help.",scope = "window",type = "boolean"},["java.signatureHelp.enabled"] = {default = false,description = "Enable/disable the signature help.",scope = "window",type = "boolean"},["java.sources.organizeImports.starThreshold"] = {default = 99,description = "Specifies the number of imports added before a star-import declaration is used.",minimum = 1,scope = "window",type = "integer"},["java.sources.organizeImports.staticStarThreshold"] = {default = 99,description = "Specifies the number of static imports added before a star-import declaration is used.",minimum = 1,scope = "window",type = "integer"},["java.symbols.includeSourceMethodDeclarations"] = {default = false,markdownDescription = "Include method declarations from source files in symbol search.",scope = "window",type = "boolean"},["java.templates.fileHeader"] = {default = {},markdownDescription = "Specifies the file header comment for new Java file. Supports configuring multi-line comments with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).",scope = "window",type = "array"},["java.templates.typeComment"] = {default = {},markdownDescription = "Specifies the type comment for new Java type. Supports configuring multi-line comments with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).",scope = "window",type = "array"},["java.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the Java language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["java.typeHierarchy.lazyLoad"] = {default = false,description = "Enable/disable lazy loading the content in type hierarchy. Lazy loading could save a lot of loading time but every type should be expanded manually to load its content.",scope = "window",type = "boolean"}},title = "Java",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/jsonls.lua b/lua/mason/_generated/lsp-schemas/json-lsp.lua
index 1bbd6b5d..1bbd6b5d 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/jsonls.lua
+++ b/lua/mason/_generated/lsp-schemas/json-lsp.lua
diff --git a/lua/mason/_generated/lsp-schemas/julia-lsp.lua b/lua/mason/_generated/lsp-schemas/julia-lsp.lua
new file mode 100644
index 00000000..d4aad042
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/julia-lsp.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["julia.NumThreads"] = {default = vim.NIL,markdownDescription = "Number of threads to use for Julia processes. A value of `auto` works on Julia versions that allow for `--threads=auto`.",scope = "machine-overridable",type = { "integer", "string", "null" }},["julia.additionalArgs"] = {default = {},description = "Additional Julia arguments.",type = "array"},["julia.cellDelimiters"] = {default = { "^##(?!#)", "^#(\\s?)%%", "^#-" },description = "Cell delimiter regular expressions for Julia files.",type = "array"},["julia.completionmode"] = {default = "qualify",description = "Sets the mode for completions.",enum = { "exportedonly", "import", "qualify" },enumDescriptions = { "Show completions for the current namespace.", "Show completions for the current namespace and unexported variables of `using`ed modules. Selection of an unexported variable will result in the automatic insertion of an explicit `using` statement.", "Show completions for the current namespace and unexported variables of `using`ed modules. Selection of an unexported variable will complete to a qualified variable name." },scope = "window",type = "string"},["julia.debuggerDefaultCompiled"] = {default = { "Base.", "-Base.!", "-Base.all", "-Base.all!", "-Base.any", "-Base.any!", "-Base.cd", "-Base.iterate", "-Base.collect", "-Base.collect_similar", "-Base._collect", "-Base.collect_to!", "-Base.collect_to_with_first!", "-Base.filter", "-Base.filter!", "-Base.foreach", "-Base.findall", "-Base.findfirst", "-Base.findlast", "-Base.findnext", "-Base.findprev", "-Base.Generator", "-Base.map", "-Base.map!", "-Base.maximum!", "-Base.minimum!", "-Base.mktemp", "-Base.mktempdir", "-Base.open", "-Base.prod!", "-Base.redirect_stderr", "-Base.redirect_stdin", "-Base.redirect_stdout", "-Base.reenable_sigint", "-Base.setindex!", "-Base.setprecision", "-Base.setrounding", "-Base.show", "-Base.sprint", "-Base.sum", "-Base.sum!", "-Base.task_local_storage", "-Base.timedwait", "-Base.withenv", "-Base.Broadcast", "Core", "Core.Compiler.", "Core.IR", "Core.Intrinsics", "DelimitedFiles", "Distributed", "LinearAlgebra.", "Serialization", "Statistics", "-Statistics.mean", "SparseArrays", "Mmap" },description = "Functions or modules that are set to compiled mode when setting the defaults.",scope = "window",type = "array"},["julia.deleteJuliaCovFiles"] = {default = true,description = "Delete Julia .cov files when running tests with coverage, leaving only a .lcov file behind.",scope = "window",type = "boolean"},["julia.editor"] = {default = "code",markdownDescription = "Command to open files from the REPL (via setting the `JULIA_EDITOR` environment variable).",type = "string"},["julia.enableCrashReporter"] = {default = vim.NIL,description = "Enable crash reports to be sent to the julia VS Code extension developers.",scope = "window",type = { "boolean", "null" }},["julia.enableTelemetry"] = {default = vim.NIL,description = "Enable usage data and errors to be sent to the julia VS Code extension developers.",scope = "window",type = { "boolean", "null" }},["julia.environmentPath"] = {default = vim.NIL,description = "Path to a julia environment. VS Code needs to be reloaded for changes to take effect.",scope = "window",type = { "string", "null" }},["julia.executablePath"] = {default = "",description = "Points to the julia executable.",scope = "machine-overridable",type = "string"},["julia.execution.codeInREPL"] = {default = false,description = "Print executed code in REPL and append it to the REPL history.",scope = "window",type = "boolean"},["julia.execution.inlineResultsForCellEvaluation"] = {default = false,markdownDescription = "Show separate inline results for all code blocks in a cell",scope = "window",type = "boolean"},["julia.execution.resultType"] = {default = "both",description = "Specifies how to show inline execution results",enum = { "REPL", "inline", "inline, errors in REPL", "both" },enumDescriptions = { "Shows inline execution results in REPL", "Shows inline execution results as inline bubbles", "Shows inline execution results in REPL and inline bubbles" },type = "string"},["julia.execution.saveOnEval"] = {default = false,markdownDescription = "Save file before execution",scope = "window",type = "boolean"},["julia.focusPlotNavigator"] = {default = false,description = "Whether to automatically show the plot navigator when plotting.",type = "boolean"},["julia.lint.call"] = {default = true,description = "This compares call signatures against all known methods for the called function. Calls with too many or too few arguments, or unknown keyword parameters are highlighted.",type = "boolean"},["julia.lint.constif"] = {default = true,description = "Check for constant conditionals in if statements that result in branches never being reached..",type = "boolean"},["julia.lint.datadecl"] = {default = true,description = "Check variables used in type declarations are datatypes.",type = "boolean"},["julia.lint.disabledDirs"] = {default = { "docs", "test" },markdownDescription = "Specifies sub-directories in [a package directory](https://docs.julialang.org/en/v1/manual/code-loading/#Package-directories-1) where only basic linting is. This drastically lowers the chance for false positives.",type = "array"},["julia.lint.iter"] = {default = true,description = "Check iterator syntax of loops. Will identify, for example, attempts to iterate over single values.",type = "boolean"},["julia.lint.lazy"] = {default = true,description = "Check for deterministic lazy boolean operators.",type = "boolean"},["julia.lint.missingrefs"] = {default = "none",description = "Highlight unknown symbols. The `symbols` option will not mark unknown fields.",enum = { "none", "symbols", "all" },type = "string"},["julia.lint.modname"] = {default = true,description = "Check submodule names do not shadow their parent's name.",type = "boolean"},["julia.lint.nothingcomp"] = {default = true,description = "Check for use of `==` rather than `===` when comparing against `nothing`. ",type = "boolean"},["julia.lint.pirates"] = {default = true,description = "Check for type piracy - the overloading of external functions with methods specified for external datatypes. 'External' here refers to imported code.",type = "boolean"},["julia.lint.run"] = {default = true,description = "Run the linter on active files.",type = "boolean"},["julia.lint.typeparam"] = {default = true,description = "Check parameters declared in `where` statements or datatype declarations are used.",type = "boolean"},["julia.lint.useoffuncargs"] = {default = true,description = "Check that all declared arguments are used within the function body.",type = "boolean"},["julia.liveTestFile"] = {default = "test/runtests.jl",description = "A workspace relative path to a Julia file that contains the tests that should be run for live testing.",scope = "window",type = "string"},["julia.packageServer"] = {default = "",markdownDescription = "Julia package server. Set's the `JULIA_PKG_SERVER` environment variable *before* starting a Julia process. Leave this empty to use the systemwide default. Requires a restart of the Julia process.",scope = "machine-overridable",type = "string"},["julia.persistentSession.alwaysCopy"] = {default = false,description = "Always copy the command for connecting to an external REPL to the clipboard.",scope = "machine-overridable",type = "boolean"},["julia.persistentSession.enabled"] = {default = false,markdownDescription = "Experimental: Starts the interactive Julia session in a persistent `tmux` session. Note that `tmux` must be available in the shell defined below. If present the string `$[workspace]` will be replaced with the current file's workspace when the REPL is first opened.",scope = "machine-overridable",type = "boolean"},["julia.persistentSession.shell"] = {default = "/bin/sh",description = "Shell used to start the persistent session.",scope = "machine-overridable",type = "string"},["julia.persistentSession.shellExecutionArgument"] = {default = "-c",markdownDescription = "Argument to execute code in the configured shell, e.g. `-c` for sh-likes or `/c` for `cmd`.",scope = "machine-overridable",type = "string"},["julia.persistentSession.tmuxSessionName"] = {default = "julia_vscode",markdownDescription = "Name of the `tmux` session.",scope = "machine-overridable",type = "string"},["julia.persistentSession.warnOnKill"] = {default = true,description = "Warn when stopping a persistent session.",scope = "machine-overridable",type = "boolean"},["julia.plots.path"] = {description = "The output directory to save plots to",scope = "window",type = "string"},["julia.runtimeCompletions"] = {default = false,description = "Request runtime completions from the integrated REPL.",scope = "application",type = "boolean"},["julia.showRuntimeDiagnostics"] = {default = true,markdownDescription = "Enable display of runtime diagnostics. These diagnostics are provided by packages that overload a `show` method for the `application/vnd.julia-vscode.diagnostics` MIME type.",type = "boolean"},["julia.symbolCacheDownload"] = {default = vim.NIL,description = "Download symbol server cache files from GitHub.",scope = "application",type = { "boolean", "null" }},["julia.symbolserverUpstream"] = {default = "https://www.julia-vscode.org/symbolcache",description = "Symbol server cache download URL.",scope = "application",type = "string"},["julia.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["julia.useCustomSysimage"] = {default = false,description = "Use an existing custom sysimage when starting the REPL",scope = "application",type = "boolean"},["julia.usePlotPane"] = {default = true,description = "Display plots within VS Code. Might require a restart of the Julia process.",type = "boolean"},["julia.useProgressFrontend"] = {default = true,markdownDescription = "Display [progress bars](https://github.com/JunoLab/ProgressLogging.jl) within VS Code.",type = "boolean"},["julia.useRevise"] = {default = true,description = "Load Revise.jl on startup of the REPL.",type = "boolean"}},title = "Julia",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/kotlin_language_server.lua b/lua/mason/_generated/lsp-schemas/kotlin-language-server.lua
index 85903a0c..85903a0c 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/kotlin_language_server.lua
+++ b/lua/mason/_generated/lsp-schemas/kotlin-language-server.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/ltex.lua b/lua/mason/_generated/lsp-schemas/ltex-ls.lua
index 1e5fbdf4..1e5fbdf4 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/ltex.lua
+++ b/lua/mason/_generated/lsp-schemas/ltex-ls.lua
diff --git a/lua/mason/_generated/lsp-schemas/lua-language-server.lua b/lua/mason/_generated/lsp-schemas/lua-language-server.lua
new file mode 100644
index 00000000..8756a800
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/lua-language-server.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["Lua.completion.autoRequire"] = {default = true,markdownDescription = "%config.completion.autoRequire%",scope = "resource",type = "boolean"},["Lua.completion.callSnippet"] = {default = "Disable",enum = { "Disable", "Both", "Replace" },markdownDescription = "%config.completion.callSnippet%",markdownEnumDescriptions = { "%config.completion.callSnippet.Disable%", "%config.completion.callSnippet.Both%", "%config.completion.callSnippet.Replace%" },scope = "resource",type = "string"},["Lua.completion.displayContext"] = {default = 0,markdownDescription = "%config.completion.displayContext%",scope = "resource",type = "integer"},["Lua.completion.enable"] = {default = true,markdownDescription = "%config.completion.enable%",scope = "resource",type = "boolean"},["Lua.completion.keywordSnippet"] = {default = "Replace",enum = { "Disable", "Both", "Replace" },markdownDescription = "%config.completion.keywordSnippet%",markdownEnumDescriptions = { "%config.completion.keywordSnippet.Disable%", "%config.completion.keywordSnippet.Both%", "%config.completion.keywordSnippet.Replace%" },scope = "resource",type = "string"},["Lua.completion.postfix"] = {default = "@",markdownDescription = "%config.completion.postfix%",scope = "resource",type = "string"},["Lua.completion.requireSeparator"] = {default = ".",markdownDescription = "%config.completion.requireSeparator%",scope = "resource",type = "string"},["Lua.completion.showParams"] = {default = true,markdownDescription = "%config.completion.showParams%",scope = "resource",type = "boolean"},["Lua.completion.showWord"] = {default = "Fallback",enum = { "Enable", "Fallback", "Disable" },markdownDescription = "%config.completion.showWord%",markdownEnumDescriptions = { "%config.completion.showWord.Enable%", "%config.completion.showWord.Fallback%", "%config.completion.showWord.Disable%" },scope = "resource",type = "string"},["Lua.completion.workspaceWord"] = {default = true,markdownDescription = "%config.completion.workspaceWord%",scope = "resource",type = "boolean"},["Lua.diagnostics.disable"] = {default = {},items = {enum = { "not-yieldable", "redundant-parameter", "break-outside", "undefined-doc-class", "unknown-symbol", "miss-method", "err-nonstandard-symbol", "unknown-attribute", "unexpect-efunc-name", "different-requires", "miss-end", "await-in-sync", "args-after-dots", "err-eq-as-assign", "newfield-call", "err-assign-as-eq", "undefined-doc-param", "param-type-mismatch", "global-in-nil-env", "missing-parameter", "miss-sep-in-table", "unknown-cast-variable", "miss-loop-min", "malformed-number", "err-do-as-then", "spell-check", "undefined-env-child", "missing-return-value", "discard-returns", "redundant-return", "miss-esc-x", "redundant-value", "duplicate-doc-alias", "doc-field-no-class", "no-visible-label", "miss-exp", "miss-loop-max", "miss-name", "empty-block", "unused-local", "err-then-as-do", "duplicate-doc-field", "redefined-label", "exp-in-action", "set-const", "circle-doc-class", "unexpect-lfunc-name", "unsupport-symbol", "unused-label", "action-after-return", "unexpect-dots", "newline-call", "jump-local-scope", "close-non-object", "miss-field", "count-down-loop", "cast-type-mismatch", "duplicate-index", "unexpect-symbol", "block-after-else", "unicode-name", "miss-exponent", "err-esc", "redundant-return-value", "unbalanced-assignments", "err-c-long-comment", "undefined-doc-name", "ambiguity-1", "trailing-space", "deprecated", "codestyle-check", "missing-return", "undefined-global", "unused-function", "code-after-break", "assign-type-mismatch", "local-limit", "cast-local-type", "need-check-nil", "keyword", "unknown-diag-code", "unused-vararg", "err-comment-prefix", "lowercase-global", "return-type-mismatch", "duplicate-set-field", "redefined-local", "no-unknown", "duplicate-doc-param", "index-in-func-name", "miss-symbol", "undefined-field", "miss-space-between" },type = "string"},markdownDescription = "%config.diagnostics.disable%",scope = "resource",type = "array"},["Lua.diagnostics.disableScheme"] = {default = { "git" },items = {type = "string"},markdownDescription = "%config.diagnostics.disableScheme%",scope = "resource",type = "array"},["Lua.diagnostics.enable"] = {default = true,markdownDescription = "%config.diagnostics.enable%",scope = "resource",type = "boolean"},["Lua.diagnostics.globals"] = {default = {},items = {type = "string"},markdownDescription = "%config.diagnostics.globals%",scope = "resource",type = "array"},["Lua.diagnostics.groupFileStatus"] = {additionalProperties = false,markdownDescription = "%config.diagnostics.groupFileStatus%",properties = {ambiguity = {default = "Fallback",description = "%config.diagnostics.ambiguity%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},await = {default = "Fallback",description = "%config.diagnostics.await%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},codestyle = {default = "Fallback",description = "%config.diagnostics.codestyle%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},duplicate = {default = "Fallback",description = "%config.diagnostics.duplicate%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},global = {default = "Fallback",description = "%config.diagnostics.global%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},luadoc = {default = "Fallback",description = "%config.diagnostics.luadoc%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},redefined = {default = "Fallback",description = "%config.diagnostics.redefined%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},strict = {default = "Fallback",description = "%config.diagnostics.strict%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},strong = {default = "Fallback",description = "%config.diagnostics.strong%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},["type-check"] = {default = "Fallback",description = "%config.diagnostics.type-check%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},unbalanced = {default = "Fallback",description = "%config.diagnostics.unbalanced%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"},unused = {default = "Fallback",description = "%config.diagnostics.unused%",enum = { "Any", "Opened", "None", "Fallback" },type = "string"}},scope = "resource",title = "groupFileStatus",type = "object"},["Lua.diagnostics.groupSeverity"] = {additionalProperties = false,markdownDescription = "%config.diagnostics.groupSeverity%",properties = {ambiguity = {default = "Fallback",description = "%config.diagnostics.ambiguity%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},await = {default = "Fallback",description = "%config.diagnostics.await%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},codestyle = {default = "Fallback",description = "%config.diagnostics.codestyle%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},duplicate = {default = "Fallback",description = "%config.diagnostics.duplicate%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},global = {default = "Fallback",description = "%config.diagnostics.global%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},luadoc = {default = "Fallback",description = "%config.diagnostics.luadoc%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},redefined = {default = "Fallback",description = "%config.diagnostics.redefined%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},strict = {default = "Fallback",description = "%config.diagnostics.strict%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},strong = {default = "Fallback",description = "%config.diagnostics.strong%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},["type-check"] = {default = "Fallback",description = "%config.diagnostics.type-check%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},unbalanced = {default = "Fallback",description = "%config.diagnostics.unbalanced%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"},unused = {default = "Fallback",description = "%config.diagnostics.unused%",enum = { "Error", "Warning", "Information", "Hint", "Fallback" },type = "string"}},scope = "resource",title = "groupSeverity",type = "object"},["Lua.diagnostics.ignoredFiles"] = {default = "Opened",enum = { "Enable", "Opened", "Disable" },markdownDescription = "%config.diagnostics.ignoredFiles%",markdownEnumDescriptions = { "%config.diagnostics.ignoredFiles.Enable%", "%config.diagnostics.ignoredFiles.Opened%", "%config.diagnostics.ignoredFiles.Disable%" },scope = "resource",type = "string"},["Lua.diagnostics.libraryFiles"] = {default = "Opened",enum = { "Enable", "Opened", "Disable" },markdownDescription = "%config.diagnostics.libraryFiles%",markdownEnumDescriptions = { "%config.diagnostics.libraryFiles.Enable%", "%config.diagnostics.libraryFiles.Opened%", "%config.diagnostics.libraryFiles.Disable%" },scope = "resource",type = "string"},["Lua.diagnostics.neededFileStatus"] = {additionalProperties = false,markdownDescription = "%config.diagnostics.neededFileStatus%",properties = {["ambiguity-1"] = {default = "Any",description = "%config.diagnostics.ambiguity-1%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["assign-type-mismatch"] = {default = "Opened",description = "%config.diagnostics.assign-type-mismatch%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["await-in-sync"] = {default = "None",description = "%config.diagnostics.await-in-sync%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["cast-local-type"] = {default = "Opened",description = "%config.diagnostics.cast-local-type%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["cast-type-mismatch"] = {default = "Any",description = "%config.diagnostics.cast-type-mismatch%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["circle-doc-class"] = {default = "Any",description = "%config.diagnostics.circle-doc-class%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["close-non-object"] = {default = "Any",description = "%config.diagnostics.close-non-object%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["code-after-break"] = {default = "Opened",description = "%config.diagnostics.code-after-break%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["codestyle-check"] = {default = "None",description = "%config.diagnostics.codestyle-check%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["count-down-loop"] = {default = "Any",description = "%config.diagnostics.count-down-loop%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},deprecated = {default = "Any",description = "%config.diagnostics.deprecated%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["different-requires"] = {default = "Any",description = "%config.diagnostics.different-requires%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["discard-returns"] = {default = "Any",description = "%config.diagnostics.discard-returns%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["doc-field-no-class"] = {default = "Any",description = "%config.diagnostics.doc-field-no-class%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["duplicate-doc-alias"] = {default = "Any",description = "%config.diagnostics.duplicate-doc-alias%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["duplicate-doc-field"] = {default = "Any",description = "%config.diagnostics.duplicate-doc-field%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["duplicate-doc-param"] = {default = "Any",description = "%config.diagnostics.duplicate-doc-param%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["duplicate-index"] = {default = "Any",description = "%config.diagnostics.duplicate-index%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["duplicate-set-field"] = {default = "Any",description = "%config.diagnostics.duplicate-set-field%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["empty-block"] = {default = "Opened",description = "%config.diagnostics.empty-block%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["global-in-nil-env"] = {default = "Any",description = "%config.diagnostics.global-in-nil-env%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["lowercase-global"] = {default = "Any",description = "%config.diagnostics.lowercase-global%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["missing-parameter"] = {default = "Any",description = "%config.diagnostics.missing-parameter%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["missing-return"] = {default = "Any",description = "%config.diagnostics.missing-return%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["missing-return-value"] = {default = "Any",description = "%config.diagnostics.missing-return-value%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["need-check-nil"] = {default = "Opened",description = "%config.diagnostics.need-check-nil%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["newfield-call"] = {default = "Any",description = "%config.diagnostics.newfield-call%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["newline-call"] = {default = "Any",description = "%config.diagnostics.newline-call%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["no-unknown"] = {default = "None",description = "%config.diagnostics.no-unknown%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["not-yieldable"] = {default = "None",description = "%config.diagnostics.not-yieldable%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["param-type-mismatch"] = {default = "Opened",description = "%config.diagnostics.param-type-mismatch%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["redefined-local"] = {default = "Opened",description = "%config.diagnostics.redefined-local%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["redundant-parameter"] = {default = "Any",description = "%config.diagnostics.redundant-parameter%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["redundant-return"] = {default = "Opened",description = "%config.diagnostics.redundant-return%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["redundant-return-value"] = {default = "Any",description = "%config.diagnostics.redundant-return-value%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["redundant-value"] = {default = "Any",description = "%config.diagnostics.redundant-value%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["return-type-mismatch"] = {default = "Opened",description = "%config.diagnostics.return-type-mismatch%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["spell-check"] = {default = "None",description = "%config.diagnostics.spell-check%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["trailing-space"] = {default = "Opened",description = "%config.diagnostics.trailing-space%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["unbalanced-assignments"] = {default = "Any",description = "%config.diagnostics.unbalanced-assignments%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["undefined-doc-class"] = {default = "Any",description = "%config.diagnostics.undefined-doc-class%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["undefined-doc-name"] = {default = "Any",description = "%config.diagnostics.undefined-doc-name%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["undefined-doc-param"] = {default = "Any",description = "%config.diagnostics.undefined-doc-param%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["undefined-env-child"] = {default = "Any",description = "%config.diagnostics.undefined-env-child%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["undefined-field"] = {default = "Opened",description = "%config.diagnostics.undefined-field%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["undefined-global"] = {default = "Any",description = "%config.diagnostics.undefined-global%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["unknown-cast-variable"] = {default = "Any",description = "%config.diagnostics.unknown-cast-variable%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["unknown-diag-code"] = {default = "Any",description = "%config.diagnostics.unknown-diag-code%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["unused-function"] = {default = "Opened",description = "%config.diagnostics.unused-function%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["unused-label"] = {default = "Opened",description = "%config.diagnostics.unused-label%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["unused-local"] = {default = "Opened",description = "%config.diagnostics.unused-local%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"},["unused-vararg"] = {default = "Opened",description = "%config.diagnostics.unused-vararg%",enum = { "Any", "Opened", "None", "Any!", "Opened!", "None!" },type = "string"}},scope = "resource",title = "neededFileStatus",type = "object"},["Lua.diagnostics.severity"] = {additionalProperties = false,markdownDescription = "%config.diagnostics.severity%",properties = {["ambiguity-1"] = {default = "Warning",description = "%config.diagnostics.ambiguity-1%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["assign-type-mismatch"] = {default = "Warning",description = "%config.diagnostics.assign-type-mismatch%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["await-in-sync"] = {default = "Warning",description = "%config.diagnostics.await-in-sync%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["cast-local-type"] = {default = "Warning",description = "%config.diagnostics.cast-local-type%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["cast-type-mismatch"] = {default = "Warning",description = "%config.diagnostics.cast-type-mismatch%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["circle-doc-class"] = {default = "Warning",description = "%config.diagnostics.circle-doc-class%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["close-non-object"] = {default = "Warning",description = "%config.diagnostics.close-non-object%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["code-after-break"] = {default = "Hint",description = "%config.diagnostics.code-after-break%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["codestyle-check"] = {default = "Warning",description = "%config.diagnostics.codestyle-check%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["count-down-loop"] = {default = "Warning",description = "%config.diagnostics.count-down-loop%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},deprecated = {default = "Warning",description = "%config.diagnostics.deprecated%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["different-requires"] = {default = "Warning",description = "%config.diagnostics.different-requires%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["discard-returns"] = {default = "Warning",description = "%config.diagnostics.discard-returns%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["doc-field-no-class"] = {default = "Warning",description = "%config.diagnostics.doc-field-no-class%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["duplicate-doc-alias"] = {default = "Warning",description = "%config.diagnostics.duplicate-doc-alias%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["duplicate-doc-field"] = {default = "Warning",description = "%config.diagnostics.duplicate-doc-field%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["duplicate-doc-param"] = {default = "Warning",description = "%config.diagnostics.duplicate-doc-param%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["duplicate-index"] = {default = "Warning",description = "%config.diagnostics.duplicate-index%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["duplicate-set-field"] = {default = "Warning",description = "%config.diagnostics.duplicate-set-field%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["empty-block"] = {default = "Hint",description = "%config.diagnostics.empty-block%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["global-in-nil-env"] = {default = "Warning",description = "%config.diagnostics.global-in-nil-env%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["lowercase-global"] = {default = "Information",description = "%config.diagnostics.lowercase-global%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["missing-parameter"] = {default = "Warning",description = "%config.diagnostics.missing-parameter%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["missing-return"] = {default = "Warning",description = "%config.diagnostics.missing-return%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["missing-return-value"] = {default = "Warning",description = "%config.diagnostics.missing-return-value%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["need-check-nil"] = {default = "Warning",description = "%config.diagnostics.need-check-nil%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["newfield-call"] = {default = "Warning",description = "%config.diagnostics.newfield-call%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["newline-call"] = {default = "Warning",description = "%config.diagnostics.newline-call%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["no-unknown"] = {default = "Warning",description = "%config.diagnostics.no-unknown%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["not-yieldable"] = {default = "Warning",description = "%config.diagnostics.not-yieldable%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["param-type-mismatch"] = {default = "Warning",description = "%config.diagnostics.param-type-mismatch%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["redefined-local"] = {default = "Hint",description = "%config.diagnostics.redefined-local%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["redundant-parameter"] = {default = "Warning",description = "%config.diagnostics.redundant-parameter%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["redundant-return"] = {default = "Hint",description = "%config.diagnostics.redundant-return%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["redundant-return-value"] = {default = "Warning",description = "%config.diagnostics.redundant-return-value%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["redundant-value"] = {default = "Warning",description = "%config.diagnostics.redundant-value%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["return-type-mismatch"] = {default = "Warning",description = "%config.diagnostics.return-type-mismatch%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["spell-check"] = {default = "Information",description = "%config.diagnostics.spell-check%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["trailing-space"] = {default = "Hint",description = "%config.diagnostics.trailing-space%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["unbalanced-assignments"] = {default = "Warning",description = "%config.diagnostics.unbalanced-assignments%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["undefined-doc-class"] = {default = "Warning",description = "%config.diagnostics.undefined-doc-class%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["undefined-doc-name"] = {default = "Warning",description = "%config.diagnostics.undefined-doc-name%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["undefined-doc-param"] = {default = "Warning",description = "%config.diagnostics.undefined-doc-param%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["undefined-env-child"] = {default = "Information",description = "%config.diagnostics.undefined-env-child%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["undefined-field"] = {default = "Warning",description = "%config.diagnostics.undefined-field%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["undefined-global"] = {default = "Warning",description = "%config.diagnostics.undefined-global%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["unknown-cast-variable"] = {default = "Warning",description = "%config.diagnostics.unknown-cast-variable%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["unknown-diag-code"] = {default = "Warning",description = "%config.diagnostics.unknown-diag-code%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["unused-function"] = {default = "Hint",description = "%config.diagnostics.unused-function%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["unused-label"] = {default = "Hint",description = "%config.diagnostics.unused-label%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["unused-local"] = {default = "Hint",description = "%config.diagnostics.unused-local%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"},["unused-vararg"] = {default = "Hint",description = "%config.diagnostics.unused-vararg%",enum = { "Error", "Warning", "Information", "Hint", "Error!", "Warning!", "Information!", "Hint!" },type = "string"}},scope = "resource",title = "severity",type = "object"},["Lua.diagnostics.workspaceDelay"] = {default = 3000,markdownDescription = "%config.diagnostics.workspaceDelay%",scope = "resource",type = "integer"},["Lua.diagnostics.workspaceRate"] = {default = 100,markdownDescription = "%config.diagnostics.workspaceRate%",scope = "resource",type = "integer"},["Lua.format.defaultConfig"] = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "%config.format.defaultConfig%",patternProperties = {[".*"] = {default = "",type = "string"}},scope = "resource",title = "defaultConfig",type = "object"},["Lua.format.enable"] = {default = true,markdownDescription = "%config.format.enable%",scope = "resource",type = "boolean"},["Lua.hint.arrayIndex"] = {default = "Auto",enum = { "Enable", "Auto", "Disable" },markdownDescription = "%config.hint.arrayIndex%",markdownEnumDescriptions = { "%config.hint.arrayIndex.Enable%", "%config.hint.arrayIndex.Auto%", "%config.hint.arrayIndex.Disable%" },scope = "resource",type = "string"},["Lua.hint.await"] = {default = true,markdownDescription = "%config.hint.await%",scope = "resource",type = "boolean"},["Lua.hint.enable"] = {default = false,markdownDescription = "%config.hint.enable%",scope = "resource",type = "boolean"},["Lua.hint.paramName"] = {default = "All",enum = { "All", "Literal", "Disable" },markdownDescription = "%config.hint.paramName%",markdownEnumDescriptions = { "%config.hint.paramName.All%", "%config.hint.paramName.Literal%", "%config.hint.paramName.Disable%" },scope = "resource",type = "string"},["Lua.hint.paramType"] = {default = true,markdownDescription = "%config.hint.paramType%",scope = "resource",type = "boolean"},["Lua.hint.semicolon"] = {default = "SameLine",enum = { "All", "SameLine", "Disable" },markdownDescription = "%config.hint.semicolon%",markdownEnumDescriptions = { "%config.hint.semicolon.All%", "%config.hint.semicolon.SameLine%", "%config.hint.semicolon.Disable%" },scope = "resource",type = "string"},["Lua.hint.setType"] = {default = false,markdownDescription = "%config.hint.setType%",scope = "resource",type = "boolean"},["Lua.hover.enable"] = {default = true,markdownDescription = "%config.hover.enable%",scope = "resource",type = "boolean"},["Lua.hover.enumsLimit"] = {default = 5,markdownDescription = "%config.hover.enumsLimit%",scope = "resource",type = "integer"},["Lua.hover.expandAlias"] = {default = true,markdownDescription = "%config.hover.expandAlias%",scope = "resource",type = "boolean"},["Lua.hover.previewFields"] = {default = 50,markdownDescription = "%config.hover.previewFields%",scope = "resource",type = "integer"},["Lua.hover.viewNumber"] = {default = true,markdownDescription = "%config.hover.viewNumber%",scope = "resource",type = "boolean"},["Lua.hover.viewString"] = {default = true,markdownDescription = "%config.hover.viewString%",scope = "resource",type = "boolean"},["Lua.hover.viewStringMax"] = {default = 1000,markdownDescription = "%config.hover.viewStringMax%",scope = "resource",type = "integer"},["Lua.misc.parameters"] = {default = {},items = {type = "string"},markdownDescription = "%config.misc.parameters%",scope = "resource",type = "array"},["Lua.runtime.builtin"] = {additionalProperties = false,markdownDescription = "%config.runtime.builtin%",properties = {basic = {default = "default",description = "%config.runtime.builtin.basic%",enum = { "default", "enable", "disable" },type = "string"},bit = {default = "default",description = "%config.runtime.builtin.bit%",enum = { "default", "enable", "disable" },type = "string"},bit32 = {default = "default",description = "%config.runtime.builtin.bit32%",enum = { "default", "enable", "disable" },type = "string"},builtin = {default = "default",description = "%config.runtime.builtin.builtin%",enum = { "default", "enable", "disable" },type = "string"},coroutine = {default = "default",description = "%config.runtime.builtin.coroutine%",enum = { "default", "enable", "disable" },type = "string"},debug = {default = "default",description = "%config.runtime.builtin.debug%",enum = { "default", "enable", "disable" },type = "string"},ffi = {default = "default",description = "%config.runtime.builtin.ffi%",enum = { "default", "enable", "disable" },type = "string"},io = {default = "default",description = "%config.runtime.builtin.io%",enum = { "default", "enable", "disable" },type = "string"},jit = {default = "default",description = "%config.runtime.builtin.jit%",enum = { "default", "enable", "disable" },type = "string"},math = {default = "default",description = "%config.runtime.builtin.math%",enum = { "default", "enable", "disable" },type = "string"},os = {default = "default",description = "%config.runtime.builtin.os%",enum = { "default", "enable", "disable" },type = "string"},package = {default = "default",description = "%config.runtime.builtin.package%",enum = { "default", "enable", "disable" },type = "string"},string = {default = "default",description = "%config.runtime.builtin.string%",enum = { "default", "enable", "disable" },type = "string"},table = {default = "default",description = "%config.runtime.builtin.table%",enum = { "default", "enable", "disable" },type = "string"},utf8 = {default = "default",description = "%config.runtime.builtin.utf8%",enum = { "default", "enable", "disable" },type = "string"}},scope = "resource",title = "builtin",type = "object"},["Lua.runtime.fileEncoding"] = {default = "utf8",enum = { "utf8", "ansi", "utf16le", "utf16be" },markdownDescription = "%config.runtime.fileEncoding%",markdownEnumDescriptions = { "%config.runtime.fileEncoding.utf8%", "%config.runtime.fileEncoding.ansi%", "%config.runtime.fileEncoding.utf16le%", "%config.runtime.fileEncoding.utf16be%" },scope = "resource",type = "string"},["Lua.runtime.meta"] = {default = "${version} ${language} ${encoding}",markdownDescription = "%config.runtime.meta%",scope = "resource",type = "string"},["Lua.runtime.nonstandardSymbol"] = {default = {},items = {enum = { "//", "/**/", "`", "+=", "-=", "*=", "/=", "%=", "^=", "//=", "|=", "&=", "<<=", ">>=", "||", "&&", "!", "!=", "continue" },type = "string"},markdownDescription = "%config.runtime.nonstandardSymbol%",scope = "resource",type = "array"},["Lua.runtime.path"] = {default = { "?.lua", "?/init.lua" },items = {type = "string"},markdownDescription = "%config.runtime.path%",scope = "resource",type = "array"},["Lua.runtime.pathStrict"] = {default = false,markdownDescription = "%config.runtime.pathStrict%",scope = "resource",type = "boolean"},["Lua.runtime.plugin"] = {default = "",markdownDescription = "%config.runtime.plugin%",scope = "resource",type = "string"},["Lua.runtime.special"] = {additionalProperties = false,default = vim.empty_dict(),markdownDescription = "%config.runtime.special%",patternProperties = {[".*"] = {default = "require",enum = { "_G", "rawset", "rawget", "setmetatable", "require", "dofile", "loadfile", "pcall", "xpcall", "assert", "error", "type" },type = "string"}},scope = "resource",title = "special",type = "object"},["Lua.runtime.unicodeName"] = {default = false,markdownDescription = "%config.runtime.unicodeName%",scope = "resource",type = "boolean"},["Lua.runtime.version"] = {default = "Lua 5.4",enum = { "Lua 5.1", "Lua 5.2", "Lua 5.3", "Lua 5.4", "LuaJIT" },markdownDescription = "%config.runtime.version%",markdownEnumDescriptions = { "%config.runtime.version.Lua 5.1%", "%config.runtime.version.Lua 5.2%", "%config.runtime.version.Lua 5.3%", "%config.runtime.version.Lua 5.4%", "%config.runtime.version.LuaJIT%" },scope = "resource",type = "string"},["Lua.semantic.annotation"] = {default = true,markdownDescription = "%config.semantic.annotation%",scope = "resource",type = "boolean"},["Lua.semantic.enable"] = {default = true,markdownDescription = "%config.semantic.enable%",scope = "resource",type = "boolean"},["Lua.semantic.keyword"] = {default = false,markdownDescription = "%config.semantic.keyword%",scope = "resource",type = "boolean"},["Lua.semantic.variable"] = {default = true,markdownDescription = "%config.semantic.variable%",scope = "resource",type = "boolean"},["Lua.signatureHelp.enable"] = {default = true,markdownDescription = "%config.signatureHelp.enable%",scope = "resource",type = "boolean"},["Lua.spell.dict"] = {default = {},items = {type = "string"},markdownDescription = "%config.spell.dict%",scope = "resource",type = "array"},["Lua.telemetry.enable"] = {default = vim.NIL,markdownDescription = "%config.telemetry.enable%",scope = "resource",tags = { "telemetry" },type = { "boolean", "null" }},["Lua.type.castNumberToInteger"] = {default = false,markdownDescription = "%config.type.castNumberToInteger%",scope = "resource",type = "boolean"},["Lua.type.weakNilCheck"] = {default = false,markdownDescription = "%config.type.weakNilCheck%",scope = "resource",type = "boolean"},["Lua.type.weakUnionCheck"] = {default = false,markdownDescription = "%config.type.weakUnionCheck%",scope = "resource",type = "boolean"},["Lua.window.progressBar"] = {default = true,markdownDescription = "%config.window.progressBar%",scope = "resource",type = "boolean"},["Lua.window.statusBar"] = {default = true,markdownDescription = "%config.window.statusBar%",scope = "resource",type = "boolean"},["Lua.workspace.checkThirdParty"] = {default = true,markdownDescription = "%config.workspace.checkThirdParty%",scope = "resource",type = "boolean"},["Lua.workspace.ignoreDir"] = {default = { ".vscode" },items = {type = "string"},markdownDescription = "%config.workspace.ignoreDir%",scope = "resource",type = "array"},["Lua.workspace.ignoreSubmodules"] = {default = true,markdownDescription = "%config.workspace.ignoreSubmodules%",scope = "resource",type = "boolean"},["Lua.workspace.library"] = {default = {},items = {type = "string"},markdownDescription = "%config.workspace.library%",scope = "resource",type = "array"},["Lua.workspace.maxPreload"] = {default = 5000,markdownDescription = "%config.workspace.maxPreload%",scope = "resource",type = "integer"},["Lua.workspace.preloadFileSize"] = {default = 500,markdownDescription = "%config.workspace.preloadFileSize%",scope = "resource",type = "integer"},["Lua.workspace.supportScheme"] = {default = { "file", "untitled", "git" },items = {type = "string"},markdownDescription = "%config.workspace.supportScheme%",scope = "resource",type = "array"},["Lua.workspace.useGitIgnore"] = {default = true,markdownDescription = "%config.workspace.useGitIgnore%",scope = "resource",type = "boolean"},["Lua.workspace.userThirdParty"] = {default = {},items = {type = "string"},markdownDescription = "%config.workspace.userThirdParty%",scope = "resource",type = "array"}},title = "Lua",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/nickel_ls.lua b/lua/mason/_generated/lsp-schemas/nickel-lang-lsp.lua
index c18af1a6..c18af1a6 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/nickel_ls.lua
+++ b/lua/mason/_generated/lsp-schemas/nickel-lang-lsp.lua
diff --git a/lua/mason/_generated/lsp-schemas/omnisharp-roslyn.lua b/lua/mason/_generated/lsp-schemas/omnisharp-roslyn.lua
new file mode 100644
index 00000000..7adac3a5
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/omnisharp-roslyn.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["csharp.format.enable"] = {default = true,description = "Enable/disable default C# formatter (requires restart).",type = "boolean"},["csharp.inlayHints.parameters.enabled"] = {default = false,description = "Display inline parameter name hints",type = "boolean"},["csharp.inlayHints.parameters.forIndexerParameters"] = {default = false,description = "Show hints for indexers",type = "boolean"},["csharp.inlayHints.parameters.forLiteralParameters"] = {default = false,description = "Show hints for literals",type = "boolean"},["csharp.inlayHints.parameters.forObjectCreationParameters"] = {default = false,description = "Show hints for 'new' expressions",type = "boolean"},["csharp.inlayHints.parameters.forOtherParameters"] = {default = false,description = "Show hints for everything else",type = "boolean"},["csharp.inlayHints.parameters.suppressForParametersThatDifferOnlyBySuffix"] = {default = false,description = "Suppress hints when parameter names differ only by suffix",type = "boolean"},["csharp.inlayHints.parameters.suppressForParametersThatMatchArgumentName"] = {default = false,description = "Suppress hints when argument matches parameter name",type = "boolean"},["csharp.inlayHints.parameters.suppressForParametersThatMatchMethodIntent"] = {default = false,description = "Suppress hints when parameter name matches the method's intent",type = "boolean"},["csharp.inlayHints.types.enabled"] = {default = false,description = "Display inline type hints",type = "boolean"},["csharp.inlayHints.types.forImplicitObjectCreation"] = {default = false,description = "Show hints for implicit object creation",type = "boolean"},["csharp.inlayHints.types.forImplicitVariableTypes"] = {default = false,description = "Show hints for variables with inferred types",type = "boolean"},["csharp.inlayHints.types.forLambdaParameterTypes"] = {default = false,description = "Show hints for lambda parameter types",type = "boolean"},["csharp.maxProjectFileCountForDiagnosticAnalysis"] = {default = 1000,description = "Specifies the maximum number of files for which diagnostics are reported for the whole workspace. If this limit is exceeded, diagnostics will be shown for currently opened files only. Specify 0 or less to disable the limit completely.",type = "number"},["csharp.referencesCodeLens.enabled"] = {default = true,description = "Specifies whether the references CodeLens should be shown.",type = "boolean"},["csharp.referencesCodeLens.filteredSymbols"] = {default = {},description = "Array of custom symbol names for which CodeLens should be disabled.",items = {type = "string"},type = "array"},["csharp.semanticHighlighting.enabled"] = {default = true,description = "Enable/disable Semantic Highlighting for C# files (Razor files currently unsupported). Defaults to false. Close open files for changes to take effect.",scope = "window",type = "boolean"},["csharp.showOmnisharpLogOnError"] = {default = true,description = "Shows the OmniSharp log in the Output pane when OmniSharp reports an error.",type = "boolean"},["csharp.suppressBuildAssetsNotification"] = {default = false,description = "Suppress the notification window to add missing assets to build or debug the application.",type = "boolean"},["csharp.suppressDotnetInstallWarning"] = {default = false,description = "Suppress the warning that the .NET Core SDK is not on the path.",type = "boolean"},["csharp.suppressDotnetRestoreNotification"] = {default = false,description = "Suppress the notification window to perform a 'dotnet restore' when dependencies can't be resolved.",type = "boolean"},["csharp.suppressHiddenDiagnostics"] = {default = true,description = "Suppress 'hidden' diagnostics (such as 'unnecessary using directives') from appearing in the editor or the Problems pane.",type = "boolean"},["csharp.suppressProjectJsonWarning"] = {default = false,description = "Suppress the warning that project.json is no longer a supported project format for .NET Core applications",type = "boolean"},["csharp.testsCodeLens.enabled"] = {default = true,description = "Specifies whether the run and debug test CodeLens should be shown.",type = "boolean"},["csharp.unitTestDebuggingOptions"] = {default = vim.empty_dict(),description = "Options to use with the debugger when launching for unit test debugging. Any launch.json option is valid here.",properties = {allowFastEvaluate = {default = true,description = "When true (the default state), the debugger will attempt faster evaluation by simulating execution of simple properties and methods.",type = "boolean"},debugServer = {default = 4711,description = "For debug extension development only: if a port is specified VS Code tries to connect to a debug adapter running in server mode",type = "number"},enableStepFiltering = {default = true,description = "Optional flag to enable stepping over Properties and Operators.",type = "boolean"},justMyCode = {default = true,description = "Optional flag to only show user code.",type = "boolean"},logging = {default = vim.empty_dict(),description = "Optional flags to determine what types of messages should be logged to the output window.",properties = {browserStdOut = {default = true,description = "Optional flag to determine if stdout text from the launching the web browser should be logged to the output window.",type = "boolean"},elapsedTiming = {default = false,description = "If true, engine logging will include `adapterElapsedTime` and `engineElapsedTime` properties to indicate the amount of time, in microseconds, that a request took.",type = "boolean"},engineLogging = {default = false,description = "Optional flag to determine whether diagnostic engine logs should be logged to the output window.",type = "boolean"},exceptions = {default = true,description = "Optional flag to determine whether exception messages should be logged to the output window.",type = "boolean"},moduleLoad = {default = true,description = "Optional flag to determine whether module load events should be logged to the output window.",type = "boolean"},processExit = {default = true,description = "Controls if a message is logged when the target process exits, or debugging is stopped. Default: `true`.",type = "boolean"},programOutput = {default = true,description = "Optional flag to determine whether program output should be logged to the output window when not using an external console.",type = "boolean"},threadExit = {default = false,description = "Controls if a message is logged when a thread in the target process exits. Default: `false`.",type = "boolean"}},required = {},type = "object"},requireExactSource = {default = true,description = "Optional flag to require current source code to match the pdb.",type = "boolean"},sourceFileMap = {additionalProperties = {type = "string"},default = {["<insert-source-path-here>"] = "<insert-target-path-here>"},description = "Optional source file mappings passed to the debug engine. Example: '{ \"C:\\foo\":\"/home/user/foo\" }'",type = "object"},sourceLinkOptions = {additionalItems = {properties = {enabled = {default = "true",description = "Is Source Link enabled for this URL? If unspecified, this option defaults to 'true'.",title = "boolean"}},type = "object"},default = {["*"] = {enabled = true}},description = "Options to control how Source Link connects to web servers. For more information: https://aka.ms/VSCode-CS-LaunchJson#source-link-options",type = "object"},suppressJITOptimizations = {default = false,description = "If true, when an optimized module (.dll compiled in the Release configuration) loads in the target process, the debugger will ask the Just-In-Time compiler to generate code with optimizations disabled. For more information: https://aka.ms/VSCode-CS-LaunchJson#suppress-jit-optimizations",type = "boolean"},symbolOptions = {default = {searchMicrosoftSymbolServer = false,searchNuGetOrgSymbolServer = false,searchPaths = {}},description = "Options to control how symbols (.pdb files) are found and loaded.",properties = {cachePath = {default = "~/.dotnet/symbolcache",description = "Directory where symbols downloaded from symbol servers should be cached. If unspecified, on Windows the debugger will default to %TEMP%\\SymbolCache, and on Linux and macOS the debugger will default to ~/.dotnet/symbolcache.",type = "string"},moduleFilter = {default = {excludedModules = {},mode = "loadAllButExcluded"},description = "Provides options to control which modules (.dll files) the debugger will attempt to load symbols (.pdb files) for.",properties = {excludedModules = {default = {},description = "Array of modules that the debugger should NOT load symbols for. Wildcards (example: MyCompany.*.dll) are supported.\n\nThis property is ignored unless 'mode' is set to 'loadAllButExcluded'.",items = {type = "string"},type = "array"},includeSymbolsNextToModules = {default = true,description = "If true, for any module NOT in the 'includedModules' array, the debugger will still check next to the module itself and the launching executable, but it will not check paths on the symbol search list. This option defaults to 'true'.\n\nThis property is ignored unless 'mode' is set to 'loadOnlyIncluded'.",type = "boolean"},includedModules = {default = { "MyExampleModule.dll" },description = "Array of modules that the debugger should load symbols for. Wildcards (example: MyCompany.*.dll) are supported.\n\nThis property is ignored unless 'mode' is set to 'loadOnlyIncluded'.",items = {type = "string"},type = "array"},mode = {default = "loadAllButExcluded",description = "Controls which of the two basic operating modes the module filter operates in.",enum = { "loadAllButExcluded", "loadOnlyIncluded" },enumDescriptions = { "Load symbols for all modules unless the module is in the 'excludedModules' array.", "Do not attempt to load symbols for ANY module unless it is in the 'includedModules' array, or it is included through the 'includeSymbolsNextToModules' setting." },type = "string"}},required = { "mode" },type = "object"},searchMicrosoftSymbolServer = {default = false,description = "If 'true' the Microsoft Symbol server (https​://msdl.microsoft.com​/download/symbols) is added to the symbols search path. If unspecified, this option defaults to 'false'.",type = "boolean"},searchNuGetOrgSymbolServer = {default = false,description = "If 'true' the NuGet.org symbol server (https​://symbols.nuget.org​/download/symbols) is added to the symbols search path. If unspecified, this option defaults to 'false'.",type = "boolean"},searchPaths = {default = {},description = "Array of symbol server URLs (example: http​://MyExampleSymbolServer) or directories (example: /build/symbols) to search for .pdb files. These directories will be searched in addition to the default locations -- next to the module and the path where the pdb was originally dropped to.",items = {type = "string"},type = "array"}},type = "object"},targetArchitecture = {description = "[Only supported in local macOS debugging] The architecture of the debuggee. This will automatically be detected unless this parameter is set. Allowed values are x86_64 or arm64.",type = "string"},type = {default = "coreclr",description = "Type type of code to debug. Can be either 'coreclr' for .NET Core debugging, or 'clr' for Desktop .NET Framework. 'clr' only works on Windows as the Desktop framework is Windows-only.",enum = { "coreclr", "clr" },type = "string"}},type = "object"},["omnisharp.analyzeOpenDocumentsOnly"] = {default = false,description = "Only run analyzers against open files when 'enableRoslynAnalyzers' is true",type = "boolean"},["omnisharp.autoStart"] = {default = true,description = "Specifies whether the OmniSharp server will be automatically started or not. If false, OmniSharp can be started with the 'Restart OmniSharp' command",type = "boolean"},["omnisharp.defaultLaunchSolution"] = {description = "The name of the default solution used at start up if the repo has multiple solutions. e.g.'MyAwesomeSolution.sln'. Default value is `null` which will cause the first in alphabetical order to be chosen.",type = "string"},["omnisharp.disableMSBuildDiagnosticWarning"] = {default = false,description = "Specifies whether notifications should be shown if OmniSharp encounters warnings or errors loading a project. Note that these warnings/errors are always emitted to the OmniSharp log",type = "boolean"},["omnisharp.dotnetPath"] = {description = 'Specified the path to a dotnet installation to use when "useModernNet" is set to true, instead of the default system one. Example: "/home/username/mycustomdotnetdirectory".',scope = "window",type = "string"},["omnisharp.enableAsyncCompletion"] = {default = false,description = "(EXPERIMENTAL) Enables support for resolving completion edits asynchronously. This can speed up time to show the completion list, particularly override and partial method completion lists, at the cost of slight delays after inserting a completion item. Most completion items will have no noticeable impact with this feature, but typing immediately after inserting an override or partial method completion, before the insert is completed, can have unpredictable results.",type = "boolean"},["omnisharp.enableDecompilationSupport"] = {default = false,description = "Enables support for decompiling external references instead of viewing metadata.",scope = "machine",type = "boolean"},["omnisharp.enableEditorConfigSupport"] = {default = true,description = "Enables support for reading code style, naming convention and analyzer settings from .editorconfig.",type = "boolean"},["omnisharp.enableImportCompletion"] = {default = false,description = "Enables support for showing unimported types and unimported extension methods in completion lists. When committed, the appropriate using directive will be added at the top of the current file. This option can have a negative impact on initial completion responsiveness, particularly for the first few completion sessions after opening a solution.",type = "boolean"},["omnisharp.enableMsBuildLoadProjectsOnDemand"] = {default = false,description = "If true, MSBuild project system will only load projects for files that were opened in the editor. This setting is useful for big C# codebases and allows for faster initialization of code navigation features only for projects that are relevant to code that is being edited. With this setting enabled OmniSharp may load fewer projects and may thus display incomplete reference lists for symbols.",type = "boolean"},["omnisharp.enableRoslynAnalyzers"] = {default = false,description = "Enables support for roslyn analyzers, code fixes and rulesets.",type = "boolean"},["omnisharp.loggingLevel"] = {default = "information",description = "Specifies the level of logging output from the OmniSharp server.",enum = { "trace", "debug", "information", "warning", "error", "critical" },type = "string"},["omnisharp.maxFindSymbolsItems"] = {default = 1000,description = "The maximum number of items that 'Go to Symbol in Workspace' operation can show. The limit is applied only when a positive number is specified here.",type = "number"},["omnisharp.maxProjectResults"] = {default = 250,description = "The maximum number of projects to be shown in the 'Select Project' dropdown (maximum 250).",type = "number"},["omnisharp.minFindSymbolsFilterLength"] = {default = 0,description = "The minimum number of characters to enter before 'Go to Symbol in Workspace' operation shows any results.",type = "number"},["omnisharp.monoPath"] = {description = 'Specifies the path to a mono installation to use when "useModernNet" is set to false, instead of the default system one. Example: "/Library/Frameworks/Mono.framework/Versions/Current"',scope = "machine",type = "string"},["omnisharp.organizeImportsOnFormat"] = {default = false,description = "Specifies whether 'using' directives should be grouped and sorted during document formatting.",type = "boolean"},["omnisharp.path"] = {description = 'Specifies the path to OmniSharp. When left empty the OmniSharp version pinned to the C# Extension is used. This can be the absolute path to an OmniSharp executable, a specific version number, or "latest". If a version number or "latest" is specified, the appropriate version of OmniSharp will be downloaded on your behalf. Setting "latest" is an opt-in into latest beta releases of OmniSharp.',scope = "machine",type = "string"},["omnisharp.projectLoadTimeout"] = {default = 60,description = "The time Visual Studio Code will wait for the OmniSharp server to start. Time is expressed in seconds.",type = "number"},["omnisharp.sdkIncludePrereleases"] = {default = true,description = 'Specifies whether to include preview versions of the .NET SDK when determining which version to use for project loading. Applies when "useModernNet" is set to true.',scope = "window",type = "boolean"},["omnisharp.sdkPath"] = {description = 'Specifies the path to a .NET SDK installation to use for project loading instead of the highest version installed. Applies when "useModernNet" is set to true. Example: /home/username/dotnet/sdks/6.0.300.',scope = "window",type = "string"},["omnisharp.sdkVersion"] = {description = 'Specifies the version of the .NET SDK to use for project loading instead of the highest version installed. Applies when "useModernNet" is set to true. Example: 6.0.300.',scope = "window",type = "string"},["omnisharp.testRunSettings"] = {description = "Path to the .runsettings file which should be used when running unit tests.",type = "string"},["omnisharp.useEditorFormattingSettings"] = {default = true,description = "Specifes whether OmniSharp should use VS Code editor settings for C# code formatting (use of tabs, indentation size).",type = "boolean"},["omnisharp.useModernNet"] = {default = true,description = "Use OmniSharp build for .NET 6. This version _does not_ support non-SDK-style .NET Framework projects, including Unity. SDK-style Framework, .NET Core, and .NET 5+ projects should see significant performance improvements.",scope = "window",title = "Use .NET 6 build of OmniSharp",type = "boolean"},["omnisharp.waitForDebugger"] = {default = false,description = "Pass the --debug flag when launching the OmniSharp server to allow a debugger to be attached.",type = "boolean"},["razor.devmode"] = {default = false,description = "Forces the omnisharp-vscode extension to run in a mode that enables local Razor.VSCode deving.",type = "boolean"},["razor.disabled"] = {default = false,description = "Specifies whether to disable Razor language features.",type = "boolean"},["razor.format.enable"] = {default = true,description = "Enable/disable default Razor formatter.",scope = "window",type = "boolean"},["razor.languageServer.debug"] = {default = false,description = "Specifies whether to wait for debug attach when launching the language server.",type = "boolean"},["razor.languageServer.directory"] = {description = "Overrides the path to the Razor Language Server directory.",scope = "machine",type = "string"},["razor.plugin.path"] = {description = "Overrides the path to the Razor plugin dll.",scope = "machine",type = "string"},["razor.trace"] = {default = "Off",description = "Specifies whether to output all messages [Verbose], some messages [Messages] or not at all [Off].",enum = { "Off", "Messages", "Verbose" },enumDescriptions = { "Does not log messages from the Razor extension", "Logs only some messages from the Razor extension", "Logs all messages from the Razor extension" },type = "string"}},title = "C# configuration"} \ No newline at end of file
diff --git a/lua/mason/_generated/lsp-schemas/perlnavigator.lua b/lua/mason/_generated/lsp-schemas/perlnavigator.lua
new file mode 100644
index 00000000..4c0bac84
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/perlnavigator.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["perlnavigator.enableWarnings"] = {default = true,description = "Enable warnings using -Mwarnings command switch",scope = "resource",type = "boolean"},["perlnavigator.includeLib"] = {default = true,description = "Boolean to indicate if $project/lib should be added to the path by default",scope = "resource",type = "boolean"},["perlnavigator.includePaths"] = {default = {},description = "Array of paths added to @INC. You can use $workspaceFolder as a placeholder.",scope = "resource",type = "array"},["perlnavigator.logging"] = {default = true,description = "Log to stdout from the navigator. Viewable in the Perl Navigator LSP log",scope = "resource",type = "boolean"},["perlnavigator.perlPath"] = {default = "perl",description = "Full path to the perl executable (no aliases, .bat files or ~/)",scope = "resource",type = "string"},["perlnavigator.perlcriticEnabled"] = {default = true,description = "Enable perl critic.",scope = "resource",type = "boolean"},["perlnavigator.perlcriticProfile"] = {default = "",description = "Path to perl critic profile. Otherwise perlcritic itself will default to ~/.perlcriticrc. (no aliases, .bat files or ~/)",scope = "resource",type = "string"},["perlnavigator.perltidyEnabled"] = {default = true,description = "Enable perl tidy.",scope = "resource",type = "boolean"},["perlnavigator.perltidyProfile"] = {default = "",description = "Path to perl tidy profile (no aliases, .bat files or ~/)",scope = "resource",type = "string"},["perlnavigator.severity1"] = {default = "hint",description = "Editor Diagnostic severity level for Critic severity 1",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.severity2"] = {default = "hint",description = "Editor Diagnostic severity level for Critic severity 2",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.severity3"] = {default = "hint",description = "Editor Diagnostic severity level for Critic severity 3",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.severity4"] = {default = "info",description = "Editor Diagnostic severity level for Critic severity 4",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.severity5"] = {default = "warning",description = "Editor Diagnostic severity level for Critic severity 5",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.trace.server"] = {default = "messages",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"}},title = "Perl Navigator",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/psalm.lua b/lua/mason/_generated/lsp-schemas/psalm.lua
index 7fffe98a..7fffe98a 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/psalm.lua
+++ b/lua/mason/_generated/lsp-schemas/psalm.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/puppet.lua b/lua/mason/_generated/lsp-schemas/puppet-editor-services.lua
index f662c090..f662c090 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/puppet.lua
+++ b/lua/mason/_generated/lsp-schemas/puppet-editor-services.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/purescriptls.lua b/lua/mason/_generated/lsp-schemas/purescript-language-server.lua
index f4815ccb..f4815ccb 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/purescriptls.lua
+++ b/lua/mason/_generated/lsp-schemas/purescript-language-server.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/pyright.lua b/lua/mason/_generated/lsp-schemas/pyright.lua
index 09282979..152658dd 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/pyright.lua
+++ b/lua/mason/_generated/lsp-schemas/pyright.lua
@@ -1,3 +1,3 @@
-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
-- stylua: ignore start
-return {properties = {["pyright.disableLanguageServices"] = {default = false,description = "Disables type completion, definitions, and references.",scope = "resource",type = "boolean"},["pyright.disableOrganizeImports"] = {default = false,description = "Disables the “Organize Imports” command.",scope = "resource",type = "boolean"},["python.analysis.autoImportCompletions"] = {default = true,description = "Offer auto-import completions.",scope = "resource",type = "boolean"},["python.analysis.autoSearchPaths"] = {default = true,description = "Automatically add common search paths like 'src'?",scope = "resource",type = "boolean"},["python.analysis.diagnosticMode"] = {default = "openFilesOnly",enum = { "openFilesOnly", "workspace" },enumDescriptions = { "Analyzes and reports errors on only open files.", "Analyzes and reports errors on all files in the workspace." },scope = "resource",type = "string"},["python.analysis.diagnosticSeverityOverrides"] = {default = vim.empty_dict(),description = "Allows a user to override the severity levels for individual diagnostics.",properties = {reportAssertAlwaysTrue = {default = "warning",description = "Diagnostics for 'assert' statement that will provably always assert. This can be indicative of a programming error.",enum = { "none", "information", "warning", "error" },type = "string"},reportCallInDefaultInitializer = {default = "none",description = "Diagnostics for function calls within a default value initialization expression. Such calls can mask expensive operations that are performed at module initialization time.",enum = { "none", "information", "warning", "error" },type = "string"},reportConstantRedefinition = {default = "none",description = "Diagnostics for attempts to redefine variables whose names are all-caps with underscores and numerals.",enum = { "none", "information", "warning", "error" },type = "string"},reportDuplicateImport = {default = "none",description = "Diagnostics for an imported symbol or module that is imported more than once.",enum = { "none", "information", "warning", "error" },type = "string"},reportFunctionMemberAccess = {default = "none",description = "Diagnostics for member accesses on functions.",enum = { "none", "information", "warning", "error" },type = "string"},reportGeneralTypeIssues = {default = "error",description = "Diagnostics for general type inconsistencies, unsupported operations, argument/parameter mismatches, etc. Covers all of the basic type-checking rules not covered by other rules. Does not include syntax errors.",enum = { "none", "information", "warning", "error" },type = "string"},reportImplicitStringConcatenation = {default = "none",description = "Diagnostics for two or more string literals that follow each other, indicating an implicit concatenation. This is considered a bad practice and often masks bugs such as missing commas.",enum = { "none", "information", "warning", "error" },type = "string"},reportImportCycles = {default = "none",description = "Diagnostics for cyclical import chains. These are not errors in Python, but they do slow down type analysis and often hint at architectural layering issues. Generally, they should be avoided.",enum = { "none", "information", "warning", "error" },type = "string"},reportIncompatibleMethodOverride = {default = "none",description = "Diagnostics for methods that override a method of the same name in a base class in an incompatible manner (wrong number of parameters, incompatible parameter types, or incompatible return type).",enum = { "none", "information", "warning", "error" },type = "string"},reportIncompatibleVariableOverride = {default = "none",description = "Diagnostics for overrides in subclasses that redefine a variable in an incompatible way.",enum = { "none", "information", "warning", "error" },type = "string"},reportIncompleteStub = {default = "none",description = "Diagnostics for the use of a module-level “__getattr__” function, indicating that the stub is incomplete.",enum = { "none", "information", "warning", "error" },type = "string"},reportInconsistentConstructor = {default = "none",description = "Diagnostics for __init__ and __new__ methods whose signatures are inconsistent.",enum = { "none", "information", "warning", "error" },type = "string"},reportInvalidStringEscapeSequence = {default = "warning",description = "Diagnostics for invalid escape sequences used within string literals. The Python specification indicates that such sequences will generate a syntax error in future versions.",enum = { "none", "information", "warning", "error" },type = "string"},reportInvalidStubStatement = {default = "none",description = "Diagnostics for type stub statements that do not conform to PEP 484.",enum = { "none", "information", "warning", "error" },type = "string"},reportInvalidTypeVarUse = {default = "warning",description = "Diagnostics for improper use of type variables in a function signature.",enum = { "none", "information", "warning", "error" },type = "string"},reportMatchNotExhaustive = {default = "none",description = "Diagnostics for 'match' statements that do not exhaustively match all possible values.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingImports = {default = "error",description = "Diagnostics for imports that have no corresponding imported python file or type stub file.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingModuleSource = {default = "warning",description = "Diagnostics for imports that have no corresponding source file. This happens when a type stub is found, but the module source file was not found, indicating that the code may fail at runtime when using this execution environment. Type checking will be done using the type stub.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingParameterType = {default = "none",description = "Diagnostics for parameters that are missing a type annotation.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingSuperCall = {default = "none",description = "Diagnostics for missing call to parent class for inherited `__init__` methods.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingTypeArgument = {default = "none",description = "Diagnostics for generic class reference with missing type arguments.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingTypeStubs = {default = "none",description = "Diagnostics for imports that have no corresponding type stub file (either a typeshed file or a custom type stub). The type checker requires type stubs to do its best job at analysis.",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalCall = {default = "error",description = "Diagnostics for an attempt to call a variable with an Optional type.",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalContextManager = {default = "error",description = "Diagnostics for an attempt to use an Optional type as a context manager (as a parameter to a with statement).",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalIterable = {default = "error",description = "Diagnostics for an attempt to use an Optional type as an iterable value (e.g. within a for statement).",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalMemberAccess = {default = "error",description = "Diagnostics for an attempt to access a member of a variable with an Optional type.",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalOperand = {default = "error",description = "Diagnostics for an attempt to use an Optional type as an operand to a binary or unary operator (like '+', '==', 'or', 'not').",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalSubscript = {default = "error",description = "Diagnostics for an attempt to subscript (index) a variable with an Optional type.",enum = { "none", "information", "warning", "error" },type = "string"},reportOverlappingOverload = {default = "none",description = "Diagnostics for function overloads that overlap in signature and obscure each other or have incompatible return types.",enum = { "none", "information", "warning", "error" },type = "string"},reportPrivateImportUsage = {default = "error",description = 'Diagnostics for incorrect usage of symbol imported from a "py.typed" module that is not re-exported from that module.',enum = { "none", "information", "warning", "error" },type = "string"},reportPrivateUsage = {default = "none",description = "Diagnostics for incorrect usage of private or protected variables or functions. Protected class members begin with a single underscore _ and can be accessed only by subclasses. Private class members begin with a double underscore but do not end in a double underscore and can be accessed only within the declaring class. Variables and functions declared outside of a class are considered private if their names start with either a single or double underscore, and they cannot be accessed outside of the declaring module.",enum = { "none", "information", "warning", "error" },type = "string"},reportPropertyTypeMismatch = {default = "none",description = "Diagnostics for property whose setter and getter have mismatched types.",enum = { "none", "information", "warning", "error" },type = "string"},reportSelfClsParameterName = {default = "warning",description = "Diagnostics for a missing or misnamed “self” parameter in instance methods and “cls” parameter in class methods. Instance methods in metaclasses (classes that derive from “type”) are allowed to use “cls” for instance methods.",enum = { "none", "information", "warning", "error" },type = "string"},reportTypedDictNotRequiredAccess = {default = "error",description = "Diagnostics for an attempt to access a non-required key within a TypedDict without a check for its presence.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnboundVariable = {default = "error",description = "Diagnostics for unbound and possibly unbound variables.",enum = { "none", "information", "warning", "error" },type = "string"},reportUndefinedVariable = {default = "error",description = "Diagnostics for a missing or misnamed “self” parameter in instance methods and “cls” parameter in class methods. Instance methods in metaclasses (classes that derive from “type”) are allowed to use “cls” for instance methods.",enum = { "none", "information", "warning", "error" },type = "string"},reportUninitializedInstanceVariable = {default = "none",description = "Diagnostics for instance variables that are not declared or initialized within class body or `__init__` method.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownArgumentType = {default = "none",description = "Diagnostics for call arguments for functions or methods that have an unknown type.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownLambdaType = {default = "none",description = "Diagnostics for input or return parameters for lambdas that have an unknown type.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownMemberType = {default = "none",description = "Diagnostics for class or instance variables that have an unknown type.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownParameterType = {default = "none",description = "Diagnostics for input or return parameters for functions or methods that have an unknown type.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownVariableType = {default = "none",description = "Diagnostics for variables that have an unknown type..",enum = { "none", "information", "warning", "error" },type = "string"},reportUnnecessaryCast = {default = "none",description = "Diagnostics for 'cast' calls that are statically determined to be unnecessary. Such calls are sometimes indicative of a programming error.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnnecessaryComparison = {default = "none",description = "Diagnostics for '==' and '!=' comparisons that are statically determined to be unnecessary. Such calls are sometimes indicative of a programming error.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnnecessaryIsInstance = {default = "none",description = "Diagnostics for 'isinstance' or 'issubclass' calls where the result is statically determined to be always true. Such calls are often indicative of a programming error.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnnecessaryTypeIgnoreComment = {default = "none",description = "Diagnostics for '# type: ignore' comments that have no effect.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnsupportedDunderAll = {default = "warning",description = "Diagnostics for unsupported operations performed on __all__.",enum = { "none", "information", "warning", "error" },type = "string"},reportUntypedBaseClass = {default = "none",description = "Diagnostics for base classes whose type cannot be determined statically. These obscure the class type, defeating many type analysis features.",enum = { "none", "information", "warning", "error" },type = "string"},reportUntypedClassDecorator = {default = "none",description = "Diagnostics for class decorators that have no type annotations. These obscure the class type, defeating many type analysis features.",enum = { "none", "information", "warning", "error" },type = "string"},reportUntypedFunctionDecorator = {default = "none",description = "Diagnostics for function decorators that have no type annotations. These obscure the function type, defeating many type analysis features.",enum = { "none", "information", "warning", "error" },type = "string"},reportUntypedNamedTuple = {default = "none",description = "Diagnostics when “namedtuple” is used rather than “NamedTuple”. The former contains no type information, whereas the latter does.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedCallResult = {default = "none",description = "Diagnostics for call expressions whose results are not consumed and are not None.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedClass = {default = "none",description = "Diagnostics for a class with a private name (starting with an underscore) that is not accessed.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedCoroutine = {default = "error",description = "Diagnostics for call expressions that return a Coroutine and whose results are not consumed.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedExpression = {default = "warning",description = "Diagnostics for simple expressions whose value is not used in any way.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedFunction = {default = "none",description = "Diagnostics for a function or method with a private name (starting with an underscore) that is not accessed.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedImport = {default = "none",description = "Diagnostics for an imported symbol that is not referenced within that file.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedVariable = {default = "none",description = "Diagnostics for a variable that is not accessed.",enum = { "none", "information", "warning", "error" },type = "string"},reportWildcardImportFromLibrary = {default = "warning",description = "Diagnostics for an wildcard import from an external library.",enum = { "none", "information", "warning", "error" },type = "string"}},scope = "resource",type = "object"},["python.analysis.extraPaths"] = {default = {},description = "Additional import search resolution paths",items = {type = "string"},scope = "resource",type = "array"},["python.analysis.logLevel"] = {default = "Information",description = "Specifies the level of logging for the Output panel",enum = { "Error", "Warning", "Information", "Trace" },type = "string"},["python.analysis.stubPath"] = {default = "typings",description = "Path to directory containing custom type stub files.",scope = "resource",type = "string"},["python.analysis.typeCheckingMode"] = {default = "basic",description = "Defines the default rule set for type checking.",enum = { "off", "basic", "strict" },scope = "resource",type = "string"},["python.analysis.typeshedPaths"] = {default = {},description = "Paths to look for typeshed modules.",items = {type = "string"},scope = "resource",type = "array"},["python.analysis.useLibraryCodeForTypes"] = {default = false,description = "Use library implementations to extract type information when type stub is not present.",scope = "resource",type = "boolean"},["python.pythonPath"] = {default = "python",description = "Path to Python, you can use a custom version of Python.",scope = "resource",type = "string"},["python.venvPath"] = {default = "",description = "Path to folder with a list of Virtual Environments.",scope = "resource",type = "string"}},title = "Pyright",type = "object"} \ No newline at end of file
+return {properties = {["pyright.disableLanguageServices"] = {default = false,description = "Disables type completion, definitions, and references.",scope = "resource",type = "boolean"},["pyright.disableOrganizeImports"] = {default = false,description = "Disables the “Organize Imports” command.",scope = "resource",type = "boolean"},["python.analysis.autoImportCompletions"] = {default = true,description = "Offer auto-import completions.",scope = "resource",type = "boolean"},["python.analysis.autoSearchPaths"] = {default = true,description = "Automatically add common search paths like 'src'?",scope = "resource",type = "boolean"},["python.analysis.diagnosticMode"] = {default = "openFilesOnly",enum = { "openFilesOnly", "workspace" },enumDescriptions = { "Analyzes and reports errors on only open files.", "Analyzes and reports errors on all files in the workspace." },scope = "resource",type = "string"},["python.analysis.diagnosticSeverityOverrides"] = {default = vim.empty_dict(),description = "Allows a user to override the severity levels for individual diagnostics.",properties = {reportAssertAlwaysTrue = {default = "warning",description = "Diagnostics for 'assert' statement that will provably always assert. This can be indicative of a programming error.",enum = { "none", "information", "warning", "error" },type = "string"},reportCallInDefaultInitializer = {default = "none",description = "Diagnostics for function calls within a default value initialization expression. Such calls can mask expensive operations that are performed at module initialization time.",enum = { "none", "information", "warning", "error" },type = "string"},reportConstantRedefinition = {default = "none",description = "Diagnostics for attempts to redefine variables whose names are all-caps with underscores and numerals.",enum = { "none", "information", "warning", "error" },type = "string"},reportDuplicateImport = {default = "none",description = "Diagnostics for an imported symbol or module that is imported more than once.",enum = { "none", "information", "warning", "error" },type = "string"},reportFunctionMemberAccess = {default = "none",description = "Diagnostics for member accesses on functions.",enum = { "none", "information", "warning", "error" },type = "string"},reportGeneralTypeIssues = {default = "error",description = "Diagnostics for general type inconsistencies, unsupported operations, argument/parameter mismatches, etc. Covers all of the basic type-checking rules not covered by other rules. Does not include syntax errors.",enum = { "none", "information", "warning", "error" },type = "string"},reportImplicitStringConcatenation = {default = "none",description = "Diagnostics for two or more string literals that follow each other, indicating an implicit concatenation. This is considered a bad practice and often masks bugs such as missing commas.",enum = { "none", "information", "warning", "error" },type = "string"},reportImportCycles = {default = "none",description = "Diagnostics for cyclical import chains. These are not errors in Python, but they do slow down type analysis and often hint at architectural layering issues. Generally, they should be avoided.",enum = { "none", "information", "warning", "error" },type = "string"},reportIncompatibleMethodOverride = {default = "none",description = "Diagnostics for methods that override a method of the same name in a base class in an incompatible manner (wrong number of parameters, incompatible parameter types, or incompatible return type).",enum = { "none", "information", "warning", "error" },type = "string"},reportIncompatibleVariableOverride = {default = "none",description = "Diagnostics for overrides in subclasses that redefine a variable in an incompatible way.",enum = { "none", "information", "warning", "error" },type = "string"},reportIncompleteStub = {default = "none",description = "Diagnostics for the use of a module-level “__getattr__” function, indicating that the stub is incomplete.",enum = { "none", "information", "warning", "error" },type = "string"},reportInconsistentConstructor = {default = "none",description = "Diagnostics for __init__ and __new__ methods whose signatures are inconsistent.",enum = { "none", "information", "warning", "error" },type = "string"},reportInvalidStringEscapeSequence = {default = "warning",description = "Diagnostics for invalid escape sequences used within string literals. The Python specification indicates that such sequences will generate a syntax error in future versions.",enum = { "none", "information", "warning", "error" },type = "string"},reportInvalidStubStatement = {default = "none",description = "Diagnostics for type stub statements that do not conform to PEP 484.",enum = { "none", "information", "warning", "error" },type = "string"},reportInvalidTypeVarUse = {default = "warning",description = "Diagnostics for improper use of type variables in a function signature.",enum = { "none", "information", "warning", "error" },type = "string"},reportMatchNotExhaustive = {default = "none",description = "Diagnostics for 'match' statements that do not exhaustively match all possible values.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingImports = {default = "error",description = "Diagnostics for imports that have no corresponding imported python file or type stub file.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingModuleSource = {default = "warning",description = "Diagnostics for imports that have no corresponding source file. This happens when a type stub is found, but the module source file was not found, indicating that the code may fail at runtime when using this execution environment. Type checking will be done using the type stub.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingParameterType = {default = "none",description = "Diagnostics for parameters that are missing a type annotation.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingSuperCall = {default = "none",description = "Diagnostics for missing call to parent class for inherited `__init__` methods.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingTypeArgument = {default = "none",description = "Diagnostics for generic class reference with missing type arguments.",enum = { "none", "information", "warning", "error" },type = "string"},reportMissingTypeStubs = {default = "none",description = "Diagnostics for imports that have no corresponding type stub file (either a typeshed file or a custom type stub). The type checker requires type stubs to do its best job at analysis.",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalCall = {default = "error",description = "Diagnostics for an attempt to call a variable with an Optional type.",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalContextManager = {default = "error",description = "Diagnostics for an attempt to use an Optional type as a context manager (as a parameter to a with statement).",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalIterable = {default = "error",description = "Diagnostics for an attempt to use an Optional type as an iterable value (e.g. within a for statement).",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalMemberAccess = {default = "error",description = "Diagnostics for an attempt to access a member of a variable with an Optional type.",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalOperand = {default = "error",description = "Diagnostics for an attempt to use an Optional type as an operand to a binary or unary operator (like '+', '==', 'or', 'not').",enum = { "none", "information", "warning", "error" },type = "string"},reportOptionalSubscript = {default = "error",description = "Diagnostics for an attempt to subscript (index) a variable with an Optional type.",enum = { "none", "information", "warning", "error" },type = "string"},reportOverlappingOverload = {default = "none",description = "Diagnostics for function overloads that overlap in signature and obscure each other or have incompatible return types.",enum = { "none", "information", "warning", "error" },type = "string"},reportPrivateImportUsage = {default = "error",description = 'Diagnostics for incorrect usage of symbol imported from a "py.typed" module that is not re-exported from that module.',enum = { "none", "information", "warning", "error" },type = "string"},reportPrivateUsage = {default = "none",description = "Diagnostics for incorrect usage of private or protected variables or functions. Protected class members begin with a single underscore _ and can be accessed only by subclasses. Private class members begin with a double underscore but do not end in a double underscore and can be accessed only within the declaring class. Variables and functions declared outside of a class are considered private if their names start with either a single or double underscore, and they cannot be accessed outside of the declaring module.",enum = { "none", "information", "warning", "error" },type = "string"},reportPropertyTypeMismatch = {default = "none",description = "Diagnostics for property whose setter and getter have mismatched types.",enum = { "none", "information", "warning", "error" },type = "string"},reportSelfClsParameterName = {default = "warning",description = "Diagnostics for a missing or misnamed “self” parameter in instance methods and “cls” parameter in class methods. Instance methods in metaclasses (classes that derive from “type”) are allowed to use “cls” for instance methods.",enum = { "none", "information", "warning", "error" },type = "string"},reportTypeCommentUsage = {default = "none",description = "Diagnostics for usage of deprecated type comments.",enum = { "none", "information", "warning", "error" },type = "string"},reportTypedDictNotRequiredAccess = {default = "error",description = "Diagnostics for an attempt to access a non-required key within a TypedDict without a check for its presence.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnboundVariable = {default = "error",description = "Diagnostics for unbound and possibly unbound variables.",enum = { "none", "information", "warning", "error" },type = "string"},reportUndefinedVariable = {default = "error",description = "Diagnostics for a missing or misnamed “self” parameter in instance methods and “cls” parameter in class methods. Instance methods in metaclasses (classes that derive from “type”) are allowed to use “cls” for instance methods.",enum = { "none", "information", "warning", "error" },type = "string"},reportUninitializedInstanceVariable = {default = "none",description = "Diagnostics for instance variables that are not declared or initialized within class body or `__init__` method.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownArgumentType = {default = "none",description = "Diagnostics for call arguments for functions or methods that have an unknown type.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownLambdaType = {default = "none",description = "Diagnostics for input or return parameters for lambdas that have an unknown type.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownMemberType = {default = "none",description = "Diagnostics for class or instance variables that have an unknown type.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownParameterType = {default = "none",description = "Diagnostics for input or return parameters for functions or methods that have an unknown type.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnknownVariableType = {default = "none",description = "Diagnostics for variables that have an unknown type..",enum = { "none", "information", "warning", "error" },type = "string"},reportUnnecessaryCast = {default = "none",description = "Diagnostics for 'cast' calls that are statically determined to be unnecessary. Such calls are sometimes indicative of a programming error.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnnecessaryComparison = {default = "none",description = "Diagnostics for '==' and '!=' comparisons that are statically determined to be unnecessary. Such calls are sometimes indicative of a programming error.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnnecessaryIsInstance = {default = "none",description = "Diagnostics for 'isinstance' or 'issubclass' calls where the result is statically determined to be always true. Such calls are often indicative of a programming error.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnnecessaryTypeIgnoreComment = {default = "none",description = "Diagnostics for '# type: ignore' comments that have no effect.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnsupportedDunderAll = {default = "warning",description = "Diagnostics for unsupported operations performed on __all__.",enum = { "none", "information", "warning", "error" },type = "string"},reportUntypedBaseClass = {default = "none",description = "Diagnostics for base classes whose type cannot be determined statically. These obscure the class type, defeating many type analysis features.",enum = { "none", "information", "warning", "error" },type = "string"},reportUntypedClassDecorator = {default = "none",description = "Diagnostics for class decorators that have no type annotations. These obscure the class type, defeating many type analysis features.",enum = { "none", "information", "warning", "error" },type = "string"},reportUntypedFunctionDecorator = {default = "none",description = "Diagnostics for function decorators that have no type annotations. These obscure the function type, defeating many type analysis features.",enum = { "none", "information", "warning", "error" },type = "string"},reportUntypedNamedTuple = {default = "none",description = "Diagnostics when “namedtuple” is used rather than “NamedTuple”. The former contains no type information, whereas the latter does.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedCallResult = {default = "none",description = "Diagnostics for call expressions whose results are not consumed and are not None.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedClass = {default = "none",description = "Diagnostics for a class with a private name (starting with an underscore) that is not accessed.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedCoroutine = {default = "error",description = "Diagnostics for call expressions that return a Coroutine and whose results are not consumed.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedExpression = {default = "warning",description = "Diagnostics for simple expressions whose value is not used in any way.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedFunction = {default = "none",description = "Diagnostics for a function or method with a private name (starting with an underscore) that is not accessed.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedImport = {default = "none",description = "Diagnostics for an imported symbol that is not referenced within that file.",enum = { "none", "information", "warning", "error" },type = "string"},reportUnusedVariable = {default = "none",description = "Diagnostics for a variable that is not accessed.",enum = { "none", "information", "warning", "error" },type = "string"},reportWildcardImportFromLibrary = {default = "warning",description = "Diagnostics for an wildcard import from an external library.",enum = { "none", "information", "warning", "error" },type = "string"}},scope = "resource",type = "object"},["python.analysis.extraPaths"] = {default = {},description = "Additional import search resolution paths",items = {type = "string"},scope = "resource",type = "array"},["python.analysis.logLevel"] = {default = "Information",description = "Specifies the level of logging for the Output panel",enum = { "Error", "Warning", "Information", "Trace" },type = "string"},["python.analysis.stubPath"] = {default = "typings",description = "Path to directory containing custom type stub files.",scope = "resource",type = "string"},["python.analysis.typeCheckingMode"] = {default = "basic",description = "Defines the default rule set for type checking.",enum = { "off", "basic", "strict" },scope = "resource",type = "string"},["python.analysis.typeshedPaths"] = {default = {},description = "Paths to look for typeshed modules.",items = {type = "string"},scope = "resource",type = "array"},["python.analysis.useLibraryCodeForTypes"] = {default = false,description = "Use library implementations to extract type information when type stub is not present.",scope = "resource",type = "boolean"},["python.pythonPath"] = {default = "python",description = "Path to Python, you can use a custom version of Python.",scope = "resource",type = "string"},["python.venvPath"] = {default = "",description = "Path to folder with a list of Virtual Environments.",scope = "resource",type = "string"}},title = "Pyright",type = "object"} \ No newline at end of file
diff --git a/lua/mason/_generated/lsp-schemas/python-lsp-server.lua b/lua/mason/_generated/lsp-schemas/python-lsp-server.lua
new file mode 100644
index 00000000..7ec31106
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/python-lsp-server.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {["$schema"] = "http://json-schema.org/draft-07/schema#",description = "This server can be configured using `workspace/didChangeConfiguration` method. Each configuration option is described below:",properties = {["pylsp.configurationSources"] = {default = { "pycodestyle" },description = "List of configuration sources to use.",items = {enum = { "pycodestyle", "pyflakes" },type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.autopep8.enabled"] = {default = true,description = "Enable or disable the plugin (disabling required to use `yapf`).",type = "boolean"},["pylsp.plugins.flake8.config"] = {default = vim.NIL,description = "Path to the config file that will be the authoritative config source.",type = { "string", "null" }},["pylsp.plugins.flake8.enabled"] = {default = false,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.flake8.exclude"] = {default = {},description = "List of files or directories to exclude.",items = {type = "string"},type = "array"},["pylsp.plugins.flake8.executable"] = {default = "flake8",description = "Path to the flake8 executable.",type = "string"},["pylsp.plugins.flake8.filename"] = {default = vim.NIL,description = "Only check for filenames matching the patterns in this list.",type = { "string", "null" }},["pylsp.plugins.flake8.hangClosing"] = {default = vim.NIL,description = "Hang closing bracket instead of matching indentation of opening bracket's line.",type = { "boolean", "null" }},["pylsp.plugins.flake8.ignore"] = {default = {},description = "List of errors and warnings to ignore (or skip).",items = {type = "string"},type = "array"},["pylsp.plugins.flake8.indentSize"] = {default = vim.NIL,description = "Set indentation spaces.",type = { "integer", "null" }},["pylsp.plugins.flake8.maxLineLength"] = {default = vim.NIL,description = "Maximum allowed line length for the entirety of this run.",type = { "integer", "null" }},["pylsp.plugins.flake8.perFileIgnores"] = {default = {},description = 'A pairing of filenames and violation codes that defines which violations to ignore in a particular file, for example: `["file_path.py:W305,W304"]`).',items = {type = "string"},type = { "array" }},["pylsp.plugins.flake8.select"] = {default = vim.NIL,description = "List of errors and warnings to enable.",items = {type = "string"},type = { "array", "null" },uniqueItems = true},["pylsp.plugins.jedi.env_vars"] = {default = vim.NIL,description = "Define environment variables for jedi.Script and Jedi.names.",type = { "object", "null" }},["pylsp.plugins.jedi.environment"] = {default = vim.NIL,description = "Define environment for jedi.Script and Jedi.names.",type = { "string", "null" }},["pylsp.plugins.jedi.extra_paths"] = {default = {},description = "Define extra paths for jedi.Script.",items = {type = "string"},type = "array"},["pylsp.plugins.jedi_completion.cache_for"] = {default = { "pandas", "numpy", "tensorflow", "matplotlib" },description = "Modules for which labels and snippets should be cached.",items = {type = "string"},type = "array"},["pylsp.plugins.jedi_completion.eager"] = {default = false,description = "Resolve documentation and detail eagerly.",type = "boolean"},["pylsp.plugins.jedi_completion.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_completion.fuzzy"] = {default = false,description = "Enable fuzzy when requesting autocomplete.",type = "boolean"},["pylsp.plugins.jedi_completion.include_class_objects"] = {default = true,description = "Adds class objects as a separate completion item.",type = "boolean"},["pylsp.plugins.jedi_completion.include_params"] = {default = true,description = "Auto-completes methods and classes with tabstops for each parameter.",type = "boolean"},["pylsp.plugins.jedi_completion.resolve_at_most"] = {default = 25,description = "How many labels and snippets (at most) should be resolved?",type = "number"},["pylsp.plugins.jedi_definition.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_definition.follow_builtin_imports"] = {default = true,description = "If follow_imports is True will decide if it follow builtin imports.",type = "boolean"},["pylsp.plugins.jedi_definition.follow_imports"] = {default = true,description = "The goto call will follow imports.",type = "boolean"},["pylsp.plugins.jedi_hover.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_references.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_signature_help.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_symbols.all_scopes"] = {default = true,description = "If True lists the names of all scopes instead of only the module namespace.",type = "boolean"},["pylsp.plugins.jedi_symbols.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_symbols.include_import_symbols"] = {default = true,description = "If True includes symbols imported from other libraries.",type = "boolean"},["pylsp.plugins.mccabe.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.mccabe.threshold"] = {default = 15,description = "The minimum threshold that triggers warnings about cyclomatic complexity.",type = "number"},["pylsp.plugins.preload.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.preload.modules"] = {default = {},description = "List of modules to import on startup",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pycodestyle.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.pycodestyle.exclude"] = {default = {},description = "Exclude files or directories which match these patterns.",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pycodestyle.filename"] = {default = {},description = "When parsing directories, only check filenames matching these patterns.",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pycodestyle.hangClosing"] = {default = vim.NIL,description = "Hang closing bracket instead of matching indentation of opening bracket's line.",type = { "boolean", "null" }},["pylsp.plugins.pycodestyle.ignore"] = {default = {},description = "Ignore errors and warnings",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pycodestyle.indentSize"] = {default = vim.NIL,description = "Set indentation spaces.",type = { "integer", "null" }},["pylsp.plugins.pycodestyle.maxLineLength"] = {default = vim.NIL,description = "Set maximum allowed line length.",type = { "number", "null" }},["pylsp.plugins.pycodestyle.select"] = {default = {},description = "Select errors and warnings",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pydocstyle.addIgnore"] = {default = {},description = "Ignore errors and warnings in addition to the specified convention.",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pydocstyle.addSelect"] = {default = {},description = "Select errors and warnings in addition to the specified convention.",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pydocstyle.convention"] = {default = vim.NIL,description = "Choose the basic list of checked errors by specifying an existing convention.",enum = { "pep257", "numpy", vim.NIL },type = { "string", "null" }},["pylsp.plugins.pydocstyle.enabled"] = {default = false,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.pydocstyle.ignore"] = {default = {},description = "Ignore errors and warnings",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pydocstyle.match"] = {default = "(?!test_).*\\.py",description = "Check only files that exactly match the given regular expression; default is to match files that don't start with 'test_' but end with '.py'.",type = "string"},["pylsp.plugins.pydocstyle.matchDir"] = {default = "[^\\.].*",description = "Search only dirs that exactly match the given regular expression; default is to match dirs which do not begin with a dot.",type = "string"},["pylsp.plugins.pydocstyle.select"] = {default = {},description = "Select errors and warnings",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pyflakes.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.pylint.args"] = {default = {},description = "Arguments to pass to pylint.",items = {type = "string"},type = "array",uniqueItems = false},["pylsp.plugins.pylint.enabled"] = {default = false,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.pylint.executable"] = {default = vim.NIL,description = "Executable to run pylint with. Enabling this will run pylint on unsaved files via stdin. Can slow down workflow. Only works with python3.",type = { "string", "null" }},["pylsp.plugins.rope_completion.eager"] = {default = false,description = "Resolve documentation and detail eagerly.",type = "boolean"},["pylsp.plugins.rope_completion.enabled"] = {default = false,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.yapf.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.rope.extensionModules"] = {default = vim.NIL,description = "Builtin and c-extension modules that are allowed to be imported and inspected by rope.",type = { "null", "string" }},["pylsp.rope.ropeFolder"] = {default = vim.NIL,description = "The name of the folder in which rope stores project configurations and data. Pass `null` for not using such a folder at all.",items = {type = "string"},type = { "null", "array" },uniqueItems = true}},title = "Python Language Server Configuration",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/r_language_server.lua b/lua/mason/_generated/lsp-schemas/r-languageserver.lua
index 27e1bbd4..27e1bbd4 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/r_language_server.lua
+++ b/lua/mason/_generated/lsp-schemas/r-languageserver.lua
diff --git a/lua/mason/_generated/lsp-schemas/rescript-lsp.lua b/lua/mason/_generated/lsp-schemas/rescript-lsp.lua
new file mode 100644
index 00000000..abceac2a
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/rescript-lsp.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["rescript.settings.askToStartBuild"] = {default = true,description = "Whether you want the extension to prompt for autostarting a ReScript build if a project is opened with no build running.",scope = "language-overridable",type = "boolean"},["rescript.settings.autoRunCodeAnalysis"] = {default = false,description = "Automatically start ReScript's code analysis.",type = "boolean"}},title = "ReScript",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/rome.lua b/lua/mason/_generated/lsp-schemas/rome.lua
index 0d3111a3..0d3111a3 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/rome.lua
+++ b/lua/mason/_generated/lsp-schemas/rome.lua
diff --git a/lua/mason/_generated/lsp-schemas/rust-analyzer.lua b/lua/mason/_generated/lsp-schemas/rust-analyzer.lua
new file mode 100644
index 00000000..ef392089
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/rust-analyzer.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["$generated-end"] = vim.empty_dict(),["$generated-start"] = vim.empty_dict(),["rust-analyzer.assist.expressionFillDefault"] = {default = "todo",enum = { "todo", "default" },enumDescriptions = { "Fill missing expressions with the `todo` macro", "Fill missing expressions with reasonable defaults, `new` or `default` constructors." },markdownDescription = "Placeholder expression to use for missing expressions in assists.",type = "string"},["rust-analyzer.cachePriming.enable"] = {default = true,markdownDescription = "Warm up caches on project load.",type = "boolean"},["rust-analyzer.cachePriming.numThreads"] = {default = 0,markdownDescription = "How many worker threads to handle priming caches. The default `0` means to pick automatically.",maximum = 255,minimum = 0,type = "number"},["rust-analyzer.cargo.autoreload"] = {default = true,markdownDescription = "Automatically refresh project info via `cargo metadata` on\n`Cargo.toml` or `.cargo/config.toml` changes.",type = "boolean"},["rust-analyzer.cargo.buildScripts.enable"] = {default = true,markdownDescription = "Run build scripts (`build.rs`) for more precise code analysis.",type = "boolean"},["rust-analyzer.cargo.buildScripts.overrideCommand"] = {default = vim.NIL,items = {type = "string"},markdownDescription = "Override the command rust-analyzer uses to run build scripts and\nbuild procedural macros. The command is required to output json\nand should therefore include `--message-format=json` or a similar\noption.\n\nBy default, a cargo invocation will be constructed for the configured\ntargets and features, with the following base command line:\n\n```bash\ncargo check --quiet --workspace --message-format=json --all-targets\n```\n.",type = { "null", "array" }},["rust-analyzer.cargo.buildScripts.useRustcWrapper"] = {default = true,markdownDescription = "Use `RUSTC_WRAPPER=rust-analyzer` when running build scripts to\navoid checking unnecessary things.",type = "boolean"},["rust-analyzer.cargo.features"] = {anyOf = { {enum = { "all" },enumDescriptions = { "Pass `--all-features` to cargo" },type = "string"}, {items = {type = "string"},type = "array"} },default = {},markdownDescription = 'List of features to activate.\n\nSet this to `"all"` to pass `--all-features` to cargo.'},["rust-analyzer.cargo.noDefaultFeatures"] = {default = false,markdownDescription = "Whether to pass `--no-default-features` to cargo.",type = "boolean"},["rust-analyzer.cargo.noSysroot"] = {default = false,markdownDescription = "Internal config for debugging, disables loading of sysroot crates.",type = "boolean"},["rust-analyzer.cargo.target"] = {default = vim.NIL,markdownDescription = "Compilation target override (target triple).",type = { "null", "string" }},["rust-analyzer.cargo.unsetTest"] = {default = { "core" },items = {type = "string"},markdownDescription = "Unsets `#[cfg(test)]` for the specified crates.",type = "array"},["rust-analyzer.cargoRunner"] = {default = vim.NIL,description = "Custom cargo runner extension ID.",type = { "null", "string" }},["rust-analyzer.checkOnSave.allTargets"] = {default = true,markdownDescription = "Check all targets and tests (`--all-targets`).",type = "boolean"},["rust-analyzer.checkOnSave.command"] = {default = "check",markdownDescription = "Cargo command to use for `cargo check`.",type = "string"},["rust-analyzer.checkOnSave.enable"] = {default = true,markdownDescription = "Run specified `cargo check` command for diagnostics on save.",type = "boolean"},["rust-analyzer.checkOnSave.extraArgs"] = {default = {},items = {type = "string"},markdownDescription = "Extra arguments for `cargo check`.",type = "array"},["rust-analyzer.checkOnSave.features"] = {anyOf = { {enum = { "all" },enumDescriptions = { "Pass `--all-features` to cargo" },type = "string"}, {items = {type = "string"},type = "array"}, {type = "null"} },default = vim.NIL,markdownDescription = 'List of features to activate. Defaults to\n`#rust-analyzer.cargo.features#`.\n\nSet to `"all"` to pass `--all-features` to Cargo.'},["rust-analyzer.checkOnSave.noDefaultFeatures"] = {default = vim.NIL,markdownDescription = "Whether to pass `--no-default-features` to Cargo. Defaults to\n`#rust-analyzer.cargo.noDefaultFeatures#`.",type = { "null", "boolean" }},["rust-analyzer.checkOnSave.overrideCommand"] = {default = vim.NIL,items = {type = "string"},markdownDescription = "Override the command rust-analyzer uses instead of `cargo check` for\ndiagnostics on save. The command is required to output json and\nshould therefor include `--message-format=json` or a similar option.\n\nIf you're changing this because you're using some tool wrapping\nCargo, you might also want to change\n`#rust-analyzer.cargo.buildScripts.overrideCommand#`.\n\nAn example command would be:\n\n```bash\ncargo check --workspace --message-format=json --all-targets\n```\n.",type = { "null", "array" }},["rust-analyzer.checkOnSave.target"] = {default = vim.NIL,markdownDescription = "Check for a specific target. Defaults to\n`#rust-analyzer.cargo.target#`.",type = { "null", "string" }},["rust-analyzer.completion.autoimport.enable"] = {default = true,markdownDescription = "Toggles the additional completions that automatically add imports when completed.\nNote that your client must specify the `additionalTextEdits` LSP client capability to truly have this feature enabled.",type = "boolean"},["rust-analyzer.completion.autoself.enable"] = {default = true,markdownDescription = "Toggles the additional completions that automatically show method calls and field accesses\nwith `self` prefixed to them when inside a method.",type = "boolean"},["rust-analyzer.completion.callable.snippets"] = {default = "fill_arguments",enum = { "fill_arguments", "add_parentheses", "none" },enumDescriptions = { "Add call parentheses and pre-fill arguments.", "Add call parentheses.", "Do no snippet completions for callables." },markdownDescription = "Whether to add parenthesis and argument snippets when completing function.",type = "string"},["rust-analyzer.completion.postfix.enable"] = {default = true,markdownDescription = "Whether to show postfix snippets like `dbg`, `if`, `not`, etc.",type = "boolean"},["rust-analyzer.completion.privateEditable.enable"] = {default = false,markdownDescription = "Enables completions of private items and fields that are defined in the current workspace even if they are not visible at the current position.",type = "boolean"},["rust-analyzer.completion.snippets.custom"] = {default = {["Arc::new"] = {body = "Arc::new(${receiver})",description = "Put the expression into an `Arc`",postfix = "arc",requires = "std::sync::Arc",scope = "expr"},["Box::pin"] = {body = "Box::pin(${receiver})",description = "Put the expression into a pinned `Box`",postfix = "pinbox",requires = "std::boxed::Box",scope = "expr"},Err = {body = "Err(${receiver})",description = "Wrap the expression in a `Result::Err`",postfix = "err",scope = "expr"},Ok = {body = "Ok(${receiver})",description = "Wrap the expression in a `Result::Ok`",postfix = "ok",scope = "expr"},["Rc::new"] = {body = "Rc::new(${receiver})",description = "Put the expression into an `Rc`",postfix = "rc",requires = "std::rc::Rc",scope = "expr"},Some = {body = "Some(${receiver})",description = "Wrap the expression in an `Option::Some`",postfix = "some",scope = "expr"}},markdownDescription = "Custom completion snippets.",type = "object"},["rust-analyzer.debug.engine"] = {default = "auto",description = "Preferred debug engine.",enum = { "auto", "vadimcn.vscode-lldb", "ms-vscode.cpptools" },markdownEnumDescriptions = { "First try to use [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb), if it's not installed try to use [MS C++ tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools).", "Use [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb)", "Use [MS C++ tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)" },type = "string"},["rust-analyzer.debug.engineSettings"] = {default = vim.empty_dict(),markdownDescription = 'Optional settings passed to the debug engine. Example: `{ "lldb": { "terminal":"external"} }`',type = "object"},["rust-analyzer.debug.openDebugPane"] = {default = false,markdownDescription = "Whether to open up the `Debug Panel` on debugging start.",type = "boolean"},["rust-analyzer.debug.sourceFileMap"] = {const = "auto",default = {["/rustc/<id>"] = "${env:USERPROFILE}/.rustup/toolchains/<toolchain-id>/lib/rustlib/src/rust"},description = "Optional source file mappings passed to the debug engine.",type = { "object", "string" }},["rust-analyzer.diagnostics.disabled"] = {default = {},items = {type = "string"},markdownDescription = "List of rust-analyzer diagnostics to disable.",type = "array",uniqueItems = true},["rust-analyzer.diagnostics.enable"] = {default = true,markdownDescription = "Whether to show native rust-analyzer diagnostics.",type = "boolean"},["rust-analyzer.diagnostics.experimental.enable"] = {default = false,markdownDescription = "Whether to show experimental rust-analyzer diagnostics that might\nhave more false positives than usual.",type = "boolean"},["rust-analyzer.diagnostics.remapPrefix"] = {default = vim.empty_dict(),markdownDescription = "Map of prefixes to be substituted when parsing diagnostic file paths.\nThis should be the reverse mapping of what is passed to `rustc` as `--remap-path-prefix`.",type = "object"},["rust-analyzer.diagnostics.warningsAsHint"] = {default = {},items = {type = "string"},markdownDescription = "List of warnings that should be displayed with hint severity.\n\nThe warnings will be indicated by faded text or three dots in code\nand will not show up in the `Problems Panel`.",type = "array"},["rust-analyzer.diagnostics.warningsAsInfo"] = {default = {},items = {type = "string"},markdownDescription = "List of warnings that should be displayed with info severity.\n\nThe warnings will be indicated by a blue squiggly underline in code\nand a blue icon in the `Problems Panel`.",type = "array"},["rust-analyzer.files.excludeDirs"] = {default = {},items = {type = "string"},markdownDescription = "These directories will be ignored by rust-analyzer. They are\nrelative to the workspace root, and globs are not supported. You may\nalso need to add the folders to Code's `files.watcherExclude`.",type = "array"},["rust-analyzer.files.watcher"] = {default = "client",markdownDescription = "Controls file watching implementation.",type = "string"},["rust-analyzer.highlightRelated.breakPoints.enable"] = {default = true,markdownDescription = "Enables highlighting of related references while the cursor is on `break`, `loop`, `while`, or `for` keywords.",type = "boolean"},["rust-analyzer.highlightRelated.exitPoints.enable"] = {default = true,markdownDescription = "Enables highlighting of all exit points while the cursor is on any `return`, `?`, `fn`, or return type arrow (`->`).",type = "boolean"},["rust-analyzer.highlightRelated.references.enable"] = {default = true,markdownDescription = "Enables highlighting of related references while the cursor is on any identifier.",type = "boolean"},["rust-analyzer.highlightRelated.yieldPoints.enable"] = {default = true,markdownDescription = "Enables highlighting of all break points for a loop or block context while the cursor is on any `async` or `await` keywords.",type = "boolean"},["rust-analyzer.hover.actions.debug.enable"] = {default = true,markdownDescription = "Whether to show `Debug` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.actions.enable"] = {default = true,markdownDescription = "Whether to show HoverActions in Rust files.",type = "boolean"},["rust-analyzer.hover.actions.gotoTypeDef.enable"] = {default = true,markdownDescription = "Whether to show `Go to Type Definition` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.actions.implementations.enable"] = {default = true,markdownDescription = "Whether to show `Implementations` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.actions.references.enable"] = {default = false,markdownDescription = "Whether to show `References` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.actions.run.enable"] = {default = true,markdownDescription = "Whether to show `Run` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.documentation.enable"] = {default = true,markdownDescription = "Whether to show documentation on hover.",type = "boolean"},["rust-analyzer.hover.links.enable"] = {default = true,markdownDescription = "Use markdown syntax for links in hover.",type = "boolean"},["rust-analyzer.imports.granularity.enforce"] = {default = false,markdownDescription = "Whether to enforce the import granularity setting for all files. If set to false rust-analyzer will try to keep import styles consistent per file.",type = "boolean"},["rust-analyzer.imports.granularity.group"] = {default = "crate",enum = { "preserve", "crate", "module", "item" },enumDescriptions = { "Do not change the granularity of any imports and preserve the original structure written by the developer.", "Merge imports from the same crate into a single use statement. Conversely, imports from different crates are split into separate statements.", "Merge imports from the same module into a single use statement. Conversely, imports from different modules are split into separate statements.", "Flatten imports so that each has its own use statement." },markdownDescription = "How imports should be grouped into use statements.",type = "string"},["rust-analyzer.imports.group.enable"] = {default = true,markdownDescription = "Group inserted imports by the [following order](https://rust-analyzer.github.io/manual.html#auto-import). Groups are separated by newlines.",type = "boolean"},["rust-analyzer.imports.merge.glob"] = {default = true,markdownDescription = "Whether to allow import insertion to merge new imports into single path glob imports like `use std::fmt::*;`.",type = "boolean"},["rust-analyzer.imports.prefix"] = {default = "plain",enum = { "plain", "self", "crate" },enumDescriptions = { "Insert import paths relative to the current module, using up to one `super` prefix if the parent module contains the requested item.", "Insert import paths relative to the current module, using up to one `super` prefix if the parent module contains the requested item. Prefixes `self` in front of the path if it starts with a module.", "Force import paths to be absolute by always starting them with `crate` or the extern crate name they come from." },markdownDescription = "The path structure for newly inserted paths to use.",type = "string"},["rust-analyzer.inlayHints.bindingModeHints.enable"] = {default = false,markdownDescription = "Whether to show inlay type hints for binding modes.",type = "boolean"},["rust-analyzer.inlayHints.chainingHints.enable"] = {default = true,markdownDescription = "Whether to show inlay type hints for method chains.",type = "boolean"},["rust-analyzer.inlayHints.closingBraceHints.enable"] = {default = true,markdownDescription = "Whether to show inlay hints after a closing `}` to indicate what item it belongs to.",type = "boolean"},["rust-analyzer.inlayHints.closingBraceHints.minLines"] = {default = 25,markdownDescription = "Minimum number of lines required before the `}` until the hint is shown (set to 0 or 1\nto always show them).",minimum = 0,type = "integer"},["rust-analyzer.inlayHints.closureReturnTypeHints.enable"] = {default = "never",enum = { "always", "never", "with_block" },enumDescriptions = { "Always show type hints for return types of closures.", "Never show type hints for return types of closures.", "Only show type hints for return types of closures with blocks." },markdownDescription = "Whether to show inlay type hints for return types of closures.",type = "string"},["rust-analyzer.inlayHints.lifetimeElisionHints.enable"] = {default = "never",enum = { "always", "never", "skip_trivial" },enumDescriptions = { "Always show lifetime elision hints.", "Never show lifetime elision hints.", "Only show lifetime elision hints if a return type is involved." },markdownDescription = "Whether to show inlay type hints for elided lifetimes in function signatures.",type = "string"},["rust-analyzer.inlayHints.lifetimeElisionHints.useParameterNames"] = {default = false,markdownDescription = "Whether to prefer using parameter names as the name for elided lifetime hints if possible.",type = "boolean"},["rust-analyzer.inlayHints.maxLength"] = {default = 25,markdownDescription = "Maximum length for inlay hints. Set to null to have an unlimited length.",minimum = 0,type = { "null", "integer" }},["rust-analyzer.inlayHints.parameterHints.enable"] = {default = true,markdownDescription = "Whether to show function parameter name inlay hints at the call\nsite.",type = "boolean"},["rust-analyzer.inlayHints.reborrowHints.enable"] = {default = "never",enum = { "always", "never", "mutable" },enumDescriptions = { "Always show reborrow hints.", "Never show reborrow hints.", "Only show mutable reborrow hints." },markdownDescription = "Whether to show inlay type hints for compiler inserted reborrows.",type = "string"},["rust-analyzer.inlayHints.renderColons"] = {default = true,markdownDescription = "Whether to render leading colons for type hints, and trailing colons for parameter hints.",type = "boolean"},["rust-analyzer.inlayHints.typeHints.enable"] = {default = true,markdownDescription = "Whether to show inlay type hints for variables.",type = "boolean"},["rust-analyzer.inlayHints.typeHints.hideClosureInitialization"] = {default = false,markdownDescription = "Whether to hide inlay type hints for `let` statements that initialize to a closure.\nOnly applies to closures with blocks, same as `#rust-analyzer.inlayHints.closureReturnTypeHints.enable#`.",type = "boolean"},["rust-analyzer.inlayHints.typeHints.hideNamedConstructor"] = {default = false,markdownDescription = "Whether to hide inlay type hints for constructors.",type = "boolean"},["rust-analyzer.joinLines.joinAssignments"] = {default = true,markdownDescription = "Join lines merges consecutive declaration and initialization of an assignment.",type = "boolean"},["rust-analyzer.joinLines.joinElseIf"] = {default = true,markdownDescription = "Join lines inserts else between consecutive ifs.",type = "boolean"},["rust-analyzer.joinLines.removeTrailingComma"] = {default = true,markdownDescription = "Join lines removes trailing commas.",type = "boolean"},["rust-analyzer.joinLines.unwrapTrivialBlock"] = {default = true,markdownDescription = "Join lines unwraps trivial blocks.",type = "boolean"},["rust-analyzer.lens.debug.enable"] = {default = true,markdownDescription = "Whether to show `Debug` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.enable"] = {default = true,markdownDescription = "Whether to show CodeLens in Rust files.",type = "boolean"},["rust-analyzer.lens.forceCustomCommands"] = {default = true,markdownDescription = "Internal config: use custom client-side commands even when the\nclient doesn't set the corresponding capability.",type = "boolean"},["rust-analyzer.lens.implementations.enable"] = {default = true,markdownDescription = "Whether to show `Implementations` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.references.adt.enable"] = {default = false,markdownDescription = "Whether to show `References` lens for Struct, Enum, and Union.\nOnly applies when `#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.references.enumVariant.enable"] = {default = false,markdownDescription = "Whether to show `References` lens for Enum Variants.\nOnly applies when `#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.references.method.enable"] = {default = false,markdownDescription = "Whether to show `Method References` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.references.trait.enable"] = {default = false,markdownDescription = "Whether to show `References` lens for Trait.\nOnly applies when `#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.run.enable"] = {default = true,markdownDescription = "Whether to show `Run` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.linkedProjects"] = {default = {},items = {type = { "string", "object" }},markdownDescription = "Disable project auto-discovery in favor of explicitly specified set\nof projects.\n\nElements must be paths pointing to `Cargo.toml`,\n`rust-project.json`, or JSON objects in `rust-project.json` format.",type = "array"},["rust-analyzer.lru.capacity"] = {default = vim.NIL,markdownDescription = "Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.",minimum = 0,type = { "null", "integer" }},["rust-analyzer.notifications.cargoTomlNotFound"] = {default = true,markdownDescription = "Whether to show `can't find Cargo.toml` error message.",type = "boolean"},["rust-analyzer.procMacro.attributes.enable"] = {default = true,markdownDescription = "Expand attribute macros. Requires `#rust-analyzer.procMacro.enable#` to be set.",type = "boolean"},["rust-analyzer.procMacro.enable"] = {default = true,markdownDescription = "Enable support for procedural macros, implies `#rust-analyzer.cargo.buildScripts.enable#`.",type = "boolean"},["rust-analyzer.procMacro.ignored"] = {default = vim.empty_dict(),markdownDescription = "These proc-macros will be ignored when trying to expand them.\n\nThis config takes a map of crate names with the exported proc-macro names to ignore as values.",type = "object"},["rust-analyzer.procMacro.server"] = {default = vim.NIL,markdownDescription = "Internal config, path to proc-macro server executable (typically,\nthis is rust-analyzer itself, but we override this in tests).",type = { "null", "string" }},["rust-analyzer.restartServerOnConfigChange"] = {default = false,markdownDescription = "Whether to restart the server automatically when certain settings that require a restart are changed.",type = "boolean"},["rust-analyzer.runnableEnv"] = {anyOf = { {type = "null"}, {items = {properties = {env = {description = 'Variables in form of { "key": "value"}',type = "object"},mask = {description = "Runnable name mask",type = "string"}},type = "object"},type = "array"}, {description = 'Variables in form of { "key": "value"}',type = "object"} },default = vim.NIL,markdownDescription = "Environment variables passed to the runnable launched using `Test` or `Debug` lens or `rust-analyzer.run` command."},["rust-analyzer.runnables.command"] = {default = vim.NIL,markdownDescription = "Command to be executed instead of 'cargo' for runnables.",type = { "null", "string" }},["rust-analyzer.runnables.extraArgs"] = {default = {},items = {type = "string"},markdownDescription = "Additional arguments to be passed to cargo for runnables such as\ntests or binaries. For example, it may be `--release`.",type = "array"},["rust-analyzer.rustc.source"] = {default = vim.NIL,markdownDescription = 'Path to the Cargo.toml of the rust compiler workspace, for usage in rustc_private\nprojects, or "discover" to try to automatically find it if the `rustc-dev` component\nis installed.\n\nAny project which uses rust-analyzer with the rustcPrivate\ncrates must set `[package.metadata.rust-analyzer] rustc_private=true` to use it.\n\nThis option does not take effect until rust-analyzer is restarted.',type = { "null", "string" }},["rust-analyzer.rustfmt.extraArgs"] = {default = {},items = {type = "string"},markdownDescription = "Additional arguments to `rustfmt`.",type = "array"},["rust-analyzer.rustfmt.overrideCommand"] = {default = vim.NIL,items = {type = "string"},markdownDescription = "Advanced option, fully override the command rust-analyzer uses for\nformatting.",type = { "null", "array" }},["rust-analyzer.rustfmt.rangeFormatting.enable"] = {default = false,markdownDescription = "Enables the use of rustfmt's unstable range formatting command for the\n`textDocument/rangeFormatting` request. The rustfmt option is unstable and only\navailable on a nightly build.",type = "boolean"},["rust-analyzer.semanticHighlighting.strings.enable"] = {default = true,markdownDescription = "Use semantic tokens for strings.\n\nIn some editors (e.g. vscode) semantic tokens override other highlighting grammars.\nBy disabling semantic tokens for strings, other grammars can be used to highlight\ntheir contents.",type = "boolean"},["rust-analyzer.server.extraEnv"] = {additionalProperties = {type = { "string", "number" }},default = vim.NIL,markdownDescription = "Extra environment variables that will be passed to the rust-analyzer executable. Useful for passing e.g. `RA_LOG` for debugging.",type = { "null", "object" }},["rust-analyzer.server.path"] = {default = vim.NIL,markdownDescription = "Path to rust-analyzer executable (points to bundled binary by default).",scope = "machine-overridable",type = { "null", "string" }},["rust-analyzer.signatureInfo.detail"] = {default = "full",enum = { "full", "parameters" },enumDescriptions = { "Show the entire signature.", "Show only the parameters." },markdownDescription = "Show full signature of the callable. Only shows parameters if disabled.",type = "string"},["rust-analyzer.signatureInfo.documentation.enable"] = {default = true,markdownDescription = "Show documentation.",type = "boolean"},["rust-analyzer.trace.extension"] = {default = false,description = "Enable logging of VS Code extensions itself.",type = "boolean"},["rust-analyzer.trace.server"] = {default = "off",description = "Trace requests to the rust-analyzer (this is usually overly verbose and not recommended for regular users).",enum = { "off", "messages", "verbose" },enumDescriptions = { "No traces", "Error only", "Full log" },scope = "window",type = "string"},["rust-analyzer.typing.autoClosingAngleBrackets.enable"] = {default = false,markdownDescription = "Whether to insert closing angle brackets when typing an opening angle bracket of a generic argument list.",type = "boolean"},["rust-analyzer.workspace.symbol.search.kind"] = {default = "only_types",enum = { "only_types", "all_symbols" },enumDescriptions = { "Search for types only.", "Search for all symbols kinds." },markdownDescription = "Workspace symbol search kind.",type = "string"},["rust-analyzer.workspace.symbol.search.limit"] = {default = 128,markdownDescription = "Limits the number of items returned from a workspace symbol search (Defaults to 128).\nSome clients like vs-code issue new searches on result filtering and don't require all results to be returned in the initial search.\nOther clients requires all results upfront and might require a higher limit.",minimum = 0,type = "integer"},["rust-analyzer.workspace.symbol.search.scope"] = {default = "workspace",enum = { "workspace", "workspace_and_dependencies" },enumDescriptions = { "Search in current workspace only.", "Search in current workspace and dependencies." },markdownDescription = "Workspace symbol search scope.",type = "string"}},title = "Rust Analyzer",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/solargraph.lua b/lua/mason/_generated/lsp-schemas/solargraph.lua
index 7cbb67fb..7cbb67fb 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/solargraph.lua
+++ b/lua/mason/_generated/lsp-schemas/solargraph.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/sorbet.lua b/lua/mason/_generated/lsp-schemas/sorbet.lua
index 7c611020..7c611020 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/sorbet.lua
+++ b/lua/mason/_generated/lsp-schemas/sorbet.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/stylelint_lsp.lua b/lua/mason/_generated/lsp-schemas/stylelint-lsp.lua
index 3612361c..3612361c 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/stylelint_lsp.lua
+++ b/lua/mason/_generated/lsp-schemas/stylelint-lsp.lua
diff --git a/lua/mason/_generated/lsp-schemas/svelte-language-server.lua b/lua/mason/_generated/lsp-schemas/svelte-language-server.lua
new file mode 100644
index 00000000..f39296f7
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/svelte-language-server.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["svelte.ask-to-enable-ts-plugin"] = {default = true,description = "Ask on startup to enable the TypeScript plugin.",title = "Ask to enable TypeScript Svelte plugin",type = "boolean"},["svelte.enable-ts-plugin"] = {default = false,description = "Enables a TypeScript plugin which provides intellisense for Svelte files inside TS/JS files.",title = "Enable TypeScript Svelte plugin",type = "boolean"},["svelte.language-server.ls-path"] = {description = "- You normally don't set this - Path to the language server executable. If you installed the \"svelte-language-server\" npm package, it's within there at \"bin/server.js\". Path can be either relative to your workspace root or absolute. Set this only if you want to use a custom version of the language server. This will then also use the workspace version of TypeScript. This setting can only be changed in user settings for security reasons.",scope = "application",title = "Language Server Path",type = "string"},["svelte.language-server.port"] = {default = -1,description = "- You normally don't set this - At which port to spawn the language server. Can be used for attaching to the process for debugging / profiling. If you experience crashes due to \"port already in use\", try setting the port. -1 = default port is used.",title = "Language Server Port",type = "number"},["svelte.language-server.runtime"] = {description = "- You normally don't need this - Path to the node executable to use to spawn the language server. This is useful when you depend on native modules such as node-sass as without this they will run in the context of vscode, meaning node version mismatch is likely. Minimum required node version is 12.17. This setting can only be changed in user settings for security reasons.",scope = "application",title = "Language Server Runtime",type = "string"},["svelte.plugin.css.colorPresentations.enable"] = {default = true,description = "Enable color picker for CSS",title = "CSS: Color Picker",type = "boolean"},["svelte.plugin.css.completions.emmet"] = {default = true,description = "Enable emmet auto completions for CSS",title = "CSS: Include Emmet Completions",type = "boolean"},["svelte.plugin.css.completions.enable"] = {default = true,description = "Enable auto completions for CSS",title = "CSS: Auto Complete",type = "boolean"},["svelte.plugin.css.diagnostics.enable"] = {default = true,description = "Enable diagnostic messages for CSS",title = "CSS: Diagnostics",type = "boolean"},["svelte.plugin.css.documentColors.enable"] = {default = true,description = "Enable document colors for CSS",title = "CSS: Document Colors",type = "boolean"},["svelte.plugin.css.documentSymbols.enable"] = {default = true,description = "Enable document symbols for CSS",title = "CSS: Symbols in Outline",type = "boolean"},["svelte.plugin.css.enable"] = {default = true,description = "Enable the CSS plugin",title = "CSS",type = "boolean"},["svelte.plugin.css.globals"] = {default = "",description = "Which css files should be checked for global variables (`--global-var: value;`). These variables are added to the css completions. String of comma-separated file paths or globs relative to workspace root.",title = "CSS: Global Files",type = "string"},["svelte.plugin.css.hover.enable"] = {default = true,description = "Enable hover info for CSS",title = "CSS: Hover Info",type = "boolean"},["svelte.plugin.css.selectionRange.enable"] = {default = true,description = "Enable selection range for CSS",title = "CSS: SelectionRange",type = "boolean"},["svelte.plugin.html.completions.emmet"] = {default = true,description = "Enable emmet auto completions for HTML",title = "HTML: Include Emmet Completions",type = "boolean"},["svelte.plugin.html.completions.enable"] = {default = true,description = "Enable auto completions for HTML",title = "HTML: Auto Complete",type = "boolean"},["svelte.plugin.html.documentSymbols.enable"] = {default = true,description = "Enable document symbols for HTML",title = "HTML: Symbols in Outline",type = "boolean"},["svelte.plugin.html.enable"] = {default = true,description = "Enable the HTML plugin",title = "HTML",type = "boolean"},["svelte.plugin.html.hover.enable"] = {default = true,description = "Enable hover info for HTML",title = "HTML: Hover Info",type = "boolean"},["svelte.plugin.html.linkedEditing.enable"] = {default = true,description = "Enable Linked Editing for HTML",title = "HTML: Linked Editing",type = "boolean"},["svelte.plugin.html.tagComplete.enable"] = {default = true,description = "Enable HTML tag auto closing",title = "HTML: Tag Auto Closing",type = "boolean"},["svelte.plugin.svelte.codeActions.enable"] = {default = true,description = "Enable Code Actions for Svelte",title = "Svelte: Code Actions",type = "boolean"},["svelte.plugin.svelte.compilerWarnings"] = {additionalProperties = {enum = { "ignore", "error" },type = "string"},default = vim.empty_dict(),description = "Svelte compiler warning codes to ignore or to treat as errors. Example: { 'css-unused-selector': 'ignore', 'unused-export-let': 'error'}",title = "Svelte: Compiler Warnings Settings",type = "object"},["svelte.plugin.svelte.completions.enable"] = {default = true,description = "Enable auto completions for Svelte",title = "Svelte: Completions",type = "boolean"},["svelte.plugin.svelte.defaultScriptLanguage"] = {default = "none",description = "The default language to use when generating new script tags",enum = { "none", "ts" },title = "Svelte: Default Script Language",type = "string"},["svelte.plugin.svelte.diagnostics.enable"] = {default = true,description = "Enable diagnostic messages for Svelte",title = "Svelte: Diagnostics",type = "boolean"},["svelte.plugin.svelte.enable"] = {default = true,description = "Enable the Svelte plugin",title = "Svelte",type = "boolean"},["svelte.plugin.svelte.format.config.printWidth"] = {default = 80,description = "Maximum line width after which code is tried to be broken up. This is a Prettier core option. If you have the Prettier extension installed, this option is ignored and the corresponding option of that extension is used instead. This option is also ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Print Width",type = "number"},["svelte.plugin.svelte.format.config.singleQuote"] = {default = false,description = "Use single quotes instead of double quotes, where possible. This is a Prettier core option. If you have the Prettier extension installed, this option is ignored and the corresponding option of that extension is used instead. This option is also ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Quotes",type = "boolean"},["svelte.plugin.svelte.format.config.svelteAllowShorthand"] = {default = true,description = "Option to enable/disable component attribute shorthand if attribute name and expression are the same. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Allow Shorthand",type = "boolean"},["svelte.plugin.svelte.format.config.svelteBracketNewLine"] = {default = true,description = "Put the `>` of a multiline element on a new line. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Bracket New Line",type = "boolean"},["svelte.plugin.svelte.format.config.svelteIndentScriptAndStyle"] = {default = true,description = "Whether or not to indent code inside `<script>` and `<style>` tags. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Indent Script And Style",type = "boolean"},["svelte.plugin.svelte.format.config.svelteSortOrder"] = {default = "options-scripts-markup-styles",description = "Format: join the keys `options`, `scripts`, `markup`, `styles` with a - in the order you want. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Sort Order",type = "string"},["svelte.plugin.svelte.format.config.svelteStrictMode"] = {default = false,description = "More strict HTML syntax. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Strict Mode",type = "boolean"},["svelte.plugin.svelte.format.enable"] = {default = true,description = "Enable formatting for Svelte (includes css & js). You can set some formatting options through this extension. They will be ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte: Format",type = "boolean"},["svelte.plugin.svelte.hover.enable"] = {default = true,description = "Enable hover information for Svelte",title = "Svelte: Hover",type = "boolean"},["svelte.plugin.svelte.rename.enable"] = {default = true,description = "Enable rename/move Svelte files functionality",title = "Svelte: Rename",type = "boolean"},["svelte.plugin.svelte.selectionRange.enable"] = {default = true,description = "Enable selection range for Svelte",title = "Svelte: Selection Range",type = "boolean"},["svelte.plugin.svelte.useNewTransformation"] = {default = false,description = "Svelte files need to be transformed to something that TypeScript understands for intellisense. Version 2.0 of this transformation can be enabled with this setting. It will be the default, soon.",title = "Use a new transformation for intellisense",type = "boolean"},["svelte.plugin.typescript.codeActions.enable"] = {default = true,description = "Enable code actions for TypeScript",title = "TypeScript: Code Actions",type = "boolean"},["svelte.plugin.typescript.completions.enable"] = {default = true,description = "Enable completions for TypeScript",title = "TypeScript: Completions",type = "boolean"},["svelte.plugin.typescript.diagnostics.enable"] = {default = true,description = "Enable diagnostic messages for TypeScript",title = "TypeScript: Diagnostics",type = "boolean"},["svelte.plugin.typescript.documentSymbols.enable"] = {default = true,description = "Enable document symbols for TypeScript",title = "TypeScript: Symbols in Outline",type = "boolean"},["svelte.plugin.typescript.enable"] = {default = true,description = "Enable the TypeScript plugin",title = "TypeScript",type = "boolean"},["svelte.plugin.typescript.hover.enable"] = {default = true,description = "Enable hover info for TypeScript",title = "TypeScript: Hover Info",type = "boolean"},["svelte.plugin.typescript.selectionRange.enable"] = {default = true,description = "Enable selection range for TypeScript",title = "TypeScript: Selection Range",type = "boolean"},["svelte.plugin.typescript.semanticTokens.enable"] = {default = true,description = "Enable semantic tokens (semantic highlight) for TypeScript.",title = "TypeScript: Semantic Tokens",type = "boolean"},["svelte.plugin.typescript.signatureHelp.enable"] = {default = true,description = "Enable signature help (parameter hints) for TypeScript",title = "TypeScript: Signature Help",type = "boolean"},["svelte.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the Svelte Language Server.",enum = { "off", "messages", "verbose" },type = "string"}},title = "Svelte",type = "object"} \ No newline at end of file
diff --git a/lua/mason/_generated/lsp-schemas/tailwindcss-language-server.lua b/lua/mason/_generated/lsp-schemas/tailwindcss-language-server.lua
new file mode 100644
index 00000000..58bfa08b
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/tailwindcss-language-server.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["tailwindCSS.classAttributes"] = {default = { "class", "className", "ngClass" },items = {type = "string"},markdownDescription = "The HTML attributes for which to provide class completions, hover previews, linting etc.",type = "array"},["tailwindCSS.codeActions"] = {default = true,markdownDescription = "Enable code actions.",scope = "language-overridable",type = "boolean"},["tailwindCSS.colorDecorators"] = {default = true,markdownDescription = "Controls whether the editor should render inline color decorators for Tailwind CSS classes and helper functions.",scope = "language-overridable",type = "boolean"},["tailwindCSS.emmetCompletions"] = {default = false,markdownDescription = "Enable class name completions when using Emmet-style syntax, for example `div.bg-red-500.uppercase`",type = "boolean"},["tailwindCSS.experimental.classRegex"] = {scope = "language-overridable",type = "array"},["tailwindCSS.experimental.configFile"] = {default = vim.NIL,markdownDescription = "Manually specify the Tailwind config file or files that should be read to provide IntelliSense features. Can either be a single string value, or an object where each key is a config file path and each value is a glob or array of globs representing the set of files that the config file applies to.",type = { "null", "string", "object" }},["tailwindCSS.files.exclude"] = {default = { "**/.git/**", "**/node_modules/**", "**/.hg/**" },items = {type = "string"},markdownDescription = "Configure glob patterns to exclude from all IntelliSense features. Inherits all glob patterns from the `#files.exclude#` setting.",type = "array"},["tailwindCSS.hovers"] = {default = true,markdownDescription = "Enable hovers.",scope = "language-overridable",type = "boolean"},["tailwindCSS.includeLanguages"] = {additionalProperties = {type = "string"},default = vim.empty_dict(),markdownDescription = 'Enable features in languages that are not supported by default. Add a mapping here between the new language and an already supported language.\n E.g.: `{"plaintext": "html"}`',type = "object"},["tailwindCSS.inspectPort"] = {default = vim.NIL,markdownDescription = "Enable the Node.js inspector agent for the language server and listen on the specified port.",type = { "number", "null" }},["tailwindCSS.lint.cssConflict"] = {default = "warning",enum = { "ignore", "warning", "error" },markdownDescription = "Class names on the same HTML element which apply the same CSS property or properties",scope = "language-overridable",type = "string"},["tailwindCSS.lint.invalidApply"] = {default = "error",enum = { "ignore", "warning", "error" },markdownDescription = "Unsupported use of the [`@apply` directive](https://tailwindcss.com/docs/functions-and-directives/#apply)",scope = "language-overridable",type = "string"},["tailwindCSS.lint.invalidConfigPath"] = {default = "error",enum = { "ignore", "warning", "error" },markdownDescription = "Unknown or invalid path used with the [`theme` helper](https://tailwindcss.com/docs/functions-and-directives/#theme)",scope = "language-overridable",type = "string"},["tailwindCSS.lint.invalidScreen"] = {default = "error",enum = { "ignore", "warning", "error" },markdownDescription = "Unknown screen name used with the [`@screen` directive](https://tailwindcss.com/docs/functions-and-directives/#screen)",scope = "language-overridable",type = "string"},["tailwindCSS.lint.invalidTailwindDirective"] = {default = "error",enum = { "ignore", "warning", "error" },markdownDescription = "Unknown value used with the [`@tailwind` directive](https://tailwindcss.com/docs/functions-and-directives/#tailwind)",scope = "language-overridable",type = "string"},["tailwindCSS.lint.invalidVariant"] = {default = "error",enum = { "ignore", "warning", "error" },markdownDescription = "Unknown variant name used with the [`@variants` directive](https://tailwindcss.com/docs/functions-and-directives/#variants)",scope = "language-overridable",type = "string"},["tailwindCSS.lint.recommendedVariantOrder"] = {default = "warning",enum = { "ignore", "warning", "error" },markdownDescription = "Class variants not in the recommended order (applies in [JIT mode](https://tailwindcss.com/docs/just-in-time-mode) only)",scope = "language-overridable",type = "string"},["tailwindCSS.rootFontSize"] = {default = 16,markdownDescription = "Root font size in pixels. Used to convert `rem` CSS values to their `px` equivalents. See `#tailwindCSS.showPixelEquivalents#`.",type = "number"},["tailwindCSS.showPixelEquivalents"] = {default = true,markdownDescription = "Show `px` equivalents for `rem` CSS values.",type = "boolean"},["tailwindCSS.suggestions"] = {default = true,markdownDescription = "Enable autocomplete suggestions.",scope = "language-overridable",type = "boolean"},["tailwindCSS.validate"] = {default = true,markdownDescription = "Enable linting. Rules can be configured individually using the `tailwindcss.lint.*` settings",scope = "language-overridable",type = "boolean"}},title = "Tailwind CSS IntelliSense"} \ No newline at end of file
diff --git a/lua/mason/_generated/lsp-schemas/typescript-language-server.lua b/lua/mason/_generated/lsp-schemas/typescript-language-server.lua
new file mode 100644
index 00000000..80cd04da
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/typescript-language-server.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {order = 20,properties = {["javascript.autoClosingTags"] = {default = true,description = "%typescript.autoClosingTags%",scope = "language-overridable",type = "boolean"},["javascript.format.enable"] = {default = true,description = "%javascript.format.enable%",scope = "window",type = "boolean"},["javascript.format.insertSpaceAfterCommaDelimiter"] = {default = true,description = "%format.insertSpaceAfterCommaDelimiter%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterConstructor"] = {default = false,description = "%format.insertSpaceAfterConstructor%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions"] = {default = true,description = "%format.insertSpaceAfterFunctionKeywordForAnonymousFunctions%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterKeywordsInControlFlowStatements"] = {default = true,description = "%format.insertSpaceAfterKeywordsInControlFlowStatements%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces"] = {default = true,description = "%format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"] = {default = false,description = "%format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"] = {default = true,description = "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"] = {default = false,description = "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"] = {default = false,description = "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"] = {default = false,description = "%format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceAfterSemicolonInForStatements"] = {default = true,description = "%format.insertSpaceAfterSemicolonInForStatements%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceBeforeAndAfterBinaryOperators"] = {default = true,description = "%format.insertSpaceBeforeAndAfterBinaryOperators%",scope = "resource",type = "boolean"},["javascript.format.insertSpaceBeforeFunctionParenthesis"] = {default = false,description = "%format.insertSpaceBeforeFunctionParenthesis%",scope = "resource",type = "boolean"},["javascript.format.placeOpenBraceOnNewLineForControlBlocks"] = {default = false,description = "%format.placeOpenBraceOnNewLineForControlBlocks%",scope = "resource",type = "boolean"},["javascript.format.placeOpenBraceOnNewLineForFunctions"] = {default = false,description = "%format.placeOpenBraceOnNewLineForFunctions%",scope = "resource",type = "boolean"},["javascript.format.semicolons"] = {default = "ignore",description = "%format.semicolons%",enum = { "ignore", "insert", "remove" },enumDescriptions = { "%format.semicolons.ignore%", "%format.semicolons.insert%", "%format.semicolons.remove%" },scope = "resource",type = "string"},["javascript.implicitProjectConfig.checkJs"] = {default = false,markdownDeprecationMessage = "%configuration.javascript.checkJs.checkJs.deprecation%",markdownDescription = "%configuration.implicitProjectConfig.checkJs%",scope = "window",type = "boolean"},["javascript.implicitProjectConfig.experimentalDecorators"] = {default = false,markdownDeprecationMessage = "%configuration.javascript.checkJs.experimentalDecorators.deprecation%",markdownDescription = "%configuration.implicitProjectConfig.experimentalDecorators%",scope = "window",type = "boolean"},["javascript.inlayHints.enumMemberValues.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.enumMemberValues.enabled%",scope = "resource",type = "boolean"},["javascript.inlayHints.functionLikeReturnTypes.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.functionLikeReturnTypes.enabled%",scope = "resource",type = "boolean"},["javascript.inlayHints.parameterNames.enabled"] = {default = "none",enum = { "none", "literals", "all" },enumDescriptions = { "%inlayHints.parameterNames.none%", "%inlayHints.parameterNames.literals%", "%inlayHints.parameterNames.all%" },markdownDescription = "%configuration.inlayHints.parameterNames.enabled%",scope = "resource",type = "string"},["javascript.inlayHints.parameterNames.suppressWhenArgumentMatchesName"] = {default = true,markdownDescription = "%configuration.inlayHints.parameterNames.suppressWhenArgumentMatchesName%",scope = "resource",type = "boolean"},["javascript.inlayHints.parameterTypes.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.parameterTypes.enabled%",scope = "resource",type = "boolean"},["javascript.inlayHints.propertyDeclarationTypes.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.propertyDeclarationTypes.enabled%",scope = "resource",type = "boolean"},["javascript.inlayHints.variableTypes.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.variableTypes.enabled%",scope = "resource",type = "boolean"},["javascript.inlayHints.variableTypes.suppressWhenTypeMatchesName"] = {default = true,markdownDescription = "%configuration.inlayHints.variableTypes.suppressWhenTypeMatchesName%",scope = "resource",type = "boolean"},["javascript.preferences.autoImportFileExcludePatterns"] = {items = {type = "string"},markdownDescription = "%typescript.preferences.autoImportFileExcludePatterns%",scope = "resource",type = "array"},["javascript.preferences.importModuleSpecifier"] = {default = "shortest",description = "%typescript.preferences.importModuleSpecifier%",enum = { "shortest", "relative", "non-relative", "project-relative" },markdownEnumDescriptions = { "%typescript.preferences.importModuleSpecifier.shortest%", "%typescript.preferences.importModuleSpecifier.relative%", "%typescript.preferences.importModuleSpecifier.nonRelative%", "%typescript.preferences.importModuleSpecifier.projectRelative%" },scope = "language-overridable",type = "string"},["javascript.preferences.importModuleSpecifierEnding"] = {default = "auto",description = "%typescript.preferences.importModuleSpecifierEnding%",enum = { "auto", "minimal", "index", "js" },markdownEnumDescriptions = { "%typescript.preferences.importModuleSpecifierEnding.auto%", "%typescript.preferences.importModuleSpecifierEnding.minimal%", "%typescript.preferences.importModuleSpecifierEnding.index%", "%typescript.preferences.importModuleSpecifierEnding.js%" },scope = "language-overridable",type = "string"},["javascript.preferences.jsxAttributeCompletionStyle"] = {default = "auto",description = "%typescript.preferences.jsxAttributeCompletionStyle%",enum = { "auto", "braces", "none" },markdownEnumDescriptions = { "%javascript.preferences.jsxAttributeCompletionStyle.auto%", "%typescript.preferences.jsxAttributeCompletionStyle.braces%", "%typescript.preferences.jsxAttributeCompletionStyle.none%" },scope = "language-overridable",type = "string"},["javascript.preferences.quoteStyle"] = {default = "auto",enum = { "auto", "single", "double" },markdownDescription = "%typescript.preferences.quoteStyle%",markdownEnumDescriptions = { "%typescript.preferences.quoteStyle.auto%", "%typescript.preferences.quoteStyle.single%", "%typescript.preferences.quoteStyle.double%" },scope = "language-overridable",type = "string"},["javascript.preferences.renameShorthandProperties"] = {default = true,deprecationMessage = "%typescript.preferences.renameShorthandProperties.deprecationMessage%",description = "%typescript.preferences.useAliasesForRenames%",scope = "language-overridable",type = "boolean"},["javascript.preferences.useAliasesForRenames"] = {default = true,description = "%typescript.preferences.useAliasesForRenames%",scope = "language-overridable",type = "boolean"},["javascript.referencesCodeLens.enabled"] = {default = false,description = "%javascript.referencesCodeLens.enabled%",scope = "window",type = "boolean"},["javascript.referencesCodeLens.showOnAllFunctions"] = {default = false,description = "%javascript.referencesCodeLens.showOnAllFunctions%",scope = "window",type = "boolean"},["javascript.suggest.autoImports"] = {default = true,description = "%configuration.suggest.autoImports%",scope = "resource",type = "boolean"},["javascript.suggest.classMemberSnippets.enabled"] = {default = true,description = "%configuration.suggest.classMemberSnippets.enabled%",scope = "resource",type = "boolean"},["javascript.suggest.completeFunctionCalls"] = {default = false,description = "%configuration.suggest.completeFunctionCalls%",scope = "resource",type = "boolean"},["javascript.suggest.completeJSDocs"] = {default = true,description = "%configuration.suggest.completeJSDocs%",scope = "language-overridable",type = "boolean"},["javascript.suggest.enabled"] = {default = true,description = "%typescript.suggest.enabled%",scope = "language-overridable",type = "boolean"},["javascript.suggest.includeAutomaticOptionalChainCompletions"] = {default = true,description = "%configuration.suggest.includeAutomaticOptionalChainCompletions%",scope = "resource",type = "boolean"},["javascript.suggest.includeCompletionsForImportStatements"] = {default = true,description = "%configuration.suggest.includeCompletionsForImportStatements%",scope = "resource",type = "boolean"},["javascript.suggest.jsdoc.generateReturns"] = {default = true,markdownDescription = "%configuration.suggest.jsdoc.generateReturns%",scope = "language-overridable",type = "boolean"},["javascript.suggest.names"] = {default = true,markdownDescription = "%configuration.suggest.names%",scope = "resource",type = "boolean"},["javascript.suggest.paths"] = {default = true,description = "%configuration.suggest.paths%",scope = "resource",type = "boolean"},["javascript.suggestionActions.enabled"] = {default = true,description = "%javascript.suggestionActions.enabled%",scope = "resource",type = "boolean"},["javascript.updateImportsOnFileMove.enabled"] = {default = "prompt",description = "%typescript.updateImportsOnFileMove.enabled%",enum = { "prompt", "always", "never" },markdownEnumDescriptions = { "%typescript.updateImportsOnFileMove.enabled.prompt%", "%typescript.updateImportsOnFileMove.enabled.always%", "%typescript.updateImportsOnFileMove.enabled.never%" },scope = "resource",type = "string"},["javascript.validate.enable"] = {default = true,description = "%javascript.validate.enable%",scope = "window",type = "boolean"},["js/ts.implicitProjectConfig.checkJs"] = {default = false,markdownDescription = "%configuration.implicitProjectConfig.checkJs%",scope = "window",type = "boolean"},["js/ts.implicitProjectConfig.experimentalDecorators"] = {default = false,markdownDescription = "%configuration.implicitProjectConfig.experimentalDecorators%",scope = "window",type = "boolean"},["js/ts.implicitProjectConfig.module"] = {default = "ESNext",enum = { "CommonJS", "AMD", "System", "UMD", "ES6", "ES2015", "ES2020", "ESNext", "None", "ES2022", "Node12", "NodeNext" },markdownDescription = "%configuration.implicitProjectConfig.module%",scope = "window",type = "string"},["js/ts.implicitProjectConfig.strictFunctionTypes"] = {default = true,markdownDescription = "%configuration.implicitProjectConfig.strictFunctionTypes%",scope = "window",type = "boolean"},["js/ts.implicitProjectConfig.strictNullChecks"] = {default = true,markdownDescription = "%configuration.implicitProjectConfig.strictNullChecks%",scope = "window",type = "boolean"},["js/ts.implicitProjectConfig.target"] = {default = "ES2020",enum = { "ES3", "ES5", "ES6", "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020", "ES2021", "ES2022", "ESNext" },markdownDescription = "%configuration.implicitProjectConfig.target%",scope = "window",type = "string"},["typescript.autoClosingTags"] = {default = true,description = "%typescript.autoClosingTags%",scope = "language-overridable",type = "boolean"},["typescript.check.npmIsInstalled"] = {default = true,markdownDescription = "%typescript.check.npmIsInstalled%",scope = "window",type = "boolean"},["typescript.disableAutomaticTypeAcquisition"] = {default = false,markdownDescription = "%typescript.disableAutomaticTypeAcquisition%",scope = "window",tags = { "usesOnlineServices" },type = "boolean"},["typescript.enablePromptUseWorkspaceTsdk"] = {default = false,description = "%typescript.enablePromptUseWorkspaceTsdk%",scope = "window",type = "boolean"},["typescript.format.enable"] = {default = true,description = "%typescript.format.enable%",scope = "window",type = "boolean"},["typescript.format.insertSpaceAfterCommaDelimiter"] = {default = true,description = "%format.insertSpaceAfterCommaDelimiter%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterConstructor"] = {default = false,description = "%format.insertSpaceAfterConstructor%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions"] = {default = true,description = "%format.insertSpaceAfterFunctionKeywordForAnonymousFunctions%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterKeywordsInControlFlowStatements"] = {default = true,description = "%format.insertSpaceAfterKeywordsInControlFlowStatements%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces"] = {default = true,description = "%format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"] = {default = false,description = "%format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"] = {default = true,description = "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"] = {default = false,description = "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"] = {default = false,description = "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"] = {default = false,description = "%format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterSemicolonInForStatements"] = {default = true,description = "%format.insertSpaceAfterSemicolonInForStatements%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceAfterTypeAssertion"] = {default = false,description = "%format.insertSpaceAfterTypeAssertion%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceBeforeAndAfterBinaryOperators"] = {default = true,description = "%format.insertSpaceBeforeAndAfterBinaryOperators%",scope = "resource",type = "boolean"},["typescript.format.insertSpaceBeforeFunctionParenthesis"] = {default = false,description = "%format.insertSpaceBeforeFunctionParenthesis%",scope = "resource",type = "boolean"},["typescript.format.placeOpenBraceOnNewLineForControlBlocks"] = {default = false,description = "%format.placeOpenBraceOnNewLineForControlBlocks%",scope = "resource",type = "boolean"},["typescript.format.placeOpenBraceOnNewLineForFunctions"] = {default = false,description = "%format.placeOpenBraceOnNewLineForFunctions%",scope = "resource",type = "boolean"},["typescript.format.semicolons"] = {default = "ignore",description = "%format.semicolons%",enum = { "ignore", "insert", "remove" },enumDescriptions = { "%format.semicolons.ignore%", "%format.semicolons.insert%", "%format.semicolons.remove%" },scope = "resource",type = "string"},["typescript.implementationsCodeLens.enabled"] = {default = false,description = "%typescript.implementationsCodeLens.enabled%",scope = "window",type = "boolean"},["typescript.inlayHints.enumMemberValues.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.enumMemberValues.enabled%",scope = "resource",type = "boolean"},["typescript.inlayHints.functionLikeReturnTypes.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.functionLikeReturnTypes.enabled%",scope = "resource",type = "boolean"},["typescript.inlayHints.parameterNames.enabled"] = {default = "none",enum = { "none", "literals", "all" },enumDescriptions = { "%inlayHints.parameterNames.none%", "%inlayHints.parameterNames.literals%", "%inlayHints.parameterNames.all%" },markdownDescription = "%configuration.inlayHints.parameterNames.enabled%",scope = "resource",type = "string"},["typescript.inlayHints.parameterNames.suppressWhenArgumentMatchesName"] = {default = true,markdownDescription = "%configuration.inlayHints.parameterNames.suppressWhenArgumentMatchesName%",scope = "resource",type = "boolean"},["typescript.inlayHints.parameterTypes.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.parameterTypes.enabled%",scope = "resource",type = "boolean"},["typescript.inlayHints.propertyDeclarationTypes.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.propertyDeclarationTypes.enabled%",scope = "resource",type = "boolean"},["typescript.inlayHints.variableTypes.enabled"] = {default = false,markdownDescription = "%configuration.inlayHints.variableTypes.enabled%",scope = "resource",type = "boolean"},["typescript.inlayHints.variableTypes.suppressWhenTypeMatchesName"] = {default = true,markdownDescription = "%configuration.inlayHints.variableTypes.suppressWhenTypeMatchesName%",scope = "resource",type = "boolean"},["typescript.locale"] = {default = "auto",enum = { "auto", "de", "es", "en", "fr", "it", "ja", "ko", "ru", "zh-CN", "zh-TW" },markdownDescription = "%typescript.locale%",scope = "window",type = "string"},["typescript.npm"] = {markdownDescription = "%typescript.npm%",scope = "machine",type = "string"},["typescript.preferences.autoImportFileExcludePatterns"] = {items = {type = "string"},markdownDescription = "%typescript.preferences.autoImportFileExcludePatterns%",scope = "resource",type = "array"},["typescript.preferences.importModuleSpecifier"] = {default = "shortest",description = "%typescript.preferences.importModuleSpecifier%",enum = { "shortest", "relative", "non-relative", "project-relative" },markdownEnumDescriptions = { "%typescript.preferences.importModuleSpecifier.shortest%", "%typescript.preferences.importModuleSpecifier.relative%", "%typescript.preferences.importModuleSpecifier.nonRelative%", "%typescript.preferences.importModuleSpecifier.projectRelative%" },scope = "language-overridable",type = "string"},["typescript.preferences.importModuleSpecifierEnding"] = {default = "auto",description = "%typescript.preferences.importModuleSpecifierEnding%",enum = { "auto", "minimal", "index", "js" },markdownEnumDescriptions = { "%typescript.preferences.importModuleSpecifierEnding.auto%", "%typescript.preferences.importModuleSpecifierEnding.minimal%", "%typescript.preferences.importModuleSpecifierEnding.index%", "%typescript.preferences.importModuleSpecifierEnding.js%" },scope = "language-overridable",type = "string"},["typescript.preferences.includePackageJsonAutoImports"] = {default = "auto",enum = { "auto", "on", "off" },enumDescriptions = { "%typescript.preferences.includePackageJsonAutoImports.auto%", "%typescript.preferences.includePackageJsonAutoImports.on%", "%typescript.preferences.includePackageJsonAutoImports.off%" },markdownDescription = "%typescript.preferences.includePackageJsonAutoImports%",scope = "window",type = "string"},["typescript.preferences.jsxAttributeCompletionStyle"] = {default = "auto",description = "%typescript.preferences.jsxAttributeCompletionStyle%",enum = { "auto", "braces", "none" },markdownEnumDescriptions = { "%typescript.preferences.jsxAttributeCompletionStyle.auto%", "%typescript.preferences.jsxAttributeCompletionStyle.braces%", "%typescript.preferences.jsxAttributeCompletionStyle.none%" },scope = "language-overridable",type = "string"},["typescript.preferences.quoteStyle"] = {default = "auto",enum = { "auto", "single", "double" },markdownDescription = "%typescript.preferences.quoteStyle%",markdownEnumDescriptions = { "%typescript.preferences.quoteStyle.auto%", "%typescript.preferences.quoteStyle.single%", "%typescript.preferences.quoteStyle.double%" },scope = "language-overridable",type = "string"},["typescript.preferences.renameShorthandProperties"] = {default = true,deprecationMessage = "%typescript.preferences.renameShorthandProperties.deprecationMessage%",description = "%typescript.preferences.useAliasesForRenames%",scope = "language-overridable",type = "boolean"},["typescript.preferences.useAliasesForRenames"] = {default = true,description = "%typescript.preferences.useAliasesForRenames%",scope = "language-overridable",type = "boolean"},["typescript.referencesCodeLens.enabled"] = {default = false,description = "%typescript.referencesCodeLens.enabled%",scope = "window",type = "boolean"},["typescript.referencesCodeLens.showOnAllFunctions"] = {default = false,description = "%typescript.referencesCodeLens.showOnAllFunctions%",scope = "window",type = "boolean"},["typescript.reportStyleChecksAsWarnings"] = {default = true,description = "%typescript.reportStyleChecksAsWarnings%",scope = "window",type = "boolean"},["typescript.suggest.autoImports"] = {default = true,description = "%configuration.suggest.autoImports%",scope = "resource",type = "boolean"},["typescript.suggest.classMemberSnippets.enabled"] = {default = true,description = "%configuration.suggest.classMemberSnippets.enabled%",scope = "resource",type = "boolean"},["typescript.suggest.completeFunctionCalls"] = {default = false,description = "%configuration.suggest.completeFunctionCalls%",scope = "resource",type = "boolean"},["typescript.suggest.completeJSDocs"] = {default = true,description = "%configuration.suggest.completeJSDocs%",scope = "language-overridable",type = "boolean"},["typescript.suggest.enabled"] = {default = true,description = "%typescript.suggest.enabled%",scope = "language-overridable",type = "boolean"},["typescript.suggest.includeAutomaticOptionalChainCompletions"] = {default = true,description = "%configuration.suggest.includeAutomaticOptionalChainCompletions%",scope = "resource",type = "boolean"},["typescript.suggest.includeCompletionsForImportStatements"] = {default = true,description = "%configuration.suggest.includeCompletionsForImportStatements%",scope = "resource",type = "boolean"},["typescript.suggest.includeCompletionsWithSnippetText"] = {default = true,description = "%configuration.suggest.includeCompletionsWithSnippetText%",scope = "resource",type = "boolean"},["typescript.suggest.jsdoc.generateReturns"] = {default = true,markdownDescription = "%configuration.suggest.jsdoc.generateReturns%",scope = "language-overridable",type = "boolean"},["typescript.suggest.objectLiteralMethodSnippets.enabled"] = {default = true,description = "%configuration.suggest.objectLiteralMethodSnippets.enabled%",scope = "resource",type = "boolean"},["typescript.suggest.paths"] = {default = true,description = "%configuration.suggest.paths%",scope = "resource",type = "boolean"},["typescript.suggestionActions.enabled"] = {default = true,description = "%typescript.suggestionActions.enabled%",scope = "resource",type = "boolean"},["typescript.surveys.enabled"] = {default = true,description = "%configuration.surveys.enabled%",scope = "window",type = "boolean"},["typescript.tsc.autoDetect"] = {default = "on",description = "%typescript.tsc.autoDetect%",enum = { "on", "off", "build", "watch" },markdownEnumDescriptions = { "%typescript.tsc.autoDetect.on%", "%typescript.tsc.autoDetect.off%", "%typescript.tsc.autoDetect.build%", "%typescript.tsc.autoDetect.watch%" },scope = "window",type = "string"},["typescript.tsdk"] = {markdownDescription = "%typescript.tsdk.desc%",scope = "window",type = "string"},["typescript.tsserver.enableTracing"] = {default = false,description = "%typescript.tsserver.enableTracing%",scope = "window",type = "boolean"},["typescript.tsserver.experimental.enableProjectDiagnostics"] = {default = false,description = "%configuration.tsserver.experimental.enableProjectDiagnostics%",scope = "window",tags = { "experimental" },type = "boolean"},["typescript.tsserver.log"] = {default = "off",description = "%typescript.tsserver.log%",enum = { "off", "terse", "normal", "verbose" },scope = "window",type = "string"},["typescript.tsserver.maxTsServerMemory"] = {default = 3072,description = "%configuration.tsserver.maxTsServerMemory%",scope = "window",type = "number"},["typescript.tsserver.pluginPaths"] = {default = {},description = "%typescript.tsserver.pluginPaths%",items = {description = "%typescript.tsserver.pluginPaths.item%",type = "string"},scope = "machine",type = "array"},["typescript.tsserver.trace"] = {default = "off",description = "%typescript.tsserver.trace%",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["typescript.tsserver.useSeparateSyntaxServer"] = {default = true,description = "%configuration.tsserver.useSeparateSyntaxServer%",markdownDeprecationMessage = "%configuration.tsserver.useSeparateSyntaxServer.deprecation%",scope = "window",type = "boolean"},["typescript.tsserver.useSyntaxServer"] = {default = "auto",description = "%configuration.tsserver.useSyntaxServer%",enum = { "always", "never", "auto" },enumDescriptions = { "%configuration.tsserver.useSyntaxServer.always%", "%configuration.tsserver.useSyntaxServer.never%", "%configuration.tsserver.useSyntaxServer.auto%" },scope = "window",type = "string"},["typescript.tsserver.watchOptions"] = {description = "%configuration.tsserver.watchOptions%",properties = {fallbackPolling = {description = "%configuration.tsserver.watchOptions.fallbackPolling%",enum = { "fixedPollingInterval", "priorityPollingInterval", "dynamicPriorityPolling" },enumDescriptions = { "configuration.tsserver.watchOptions.fallbackPolling.fixedPollingInterval", "configuration.tsserver.watchOptions.fallbackPolling.priorityPollingInterval", "configuration.tsserver.watchOptions.fallbackPolling.dynamicPriorityPolling" },type = "string"},synchronousWatchDirectory = {description = "%configuration.tsserver.watchOptions.synchronousWatchDirectory%",type = "boolean"},watchDirectory = {default = "useFsEvents",description = "%configuration.tsserver.watchOptions.watchDirectory%",enum = { "fixedChunkSizePolling", "fixedPollingInterval", "dynamicPriorityPolling", "useFsEvents" },enumDescriptions = { "%configuration.tsserver.watchOptions.watchDirectory.fixedChunkSizePolling%", "%configuration.tsserver.watchOptions.watchDirectory.fixedPollingInterval%", "%configuration.tsserver.watchOptions.watchDirectory.dynamicPriorityPolling%", "%configuration.tsserver.watchOptions.watchDirectory.useFsEvents%" },type = "string"},watchFile = {default = "useFsEvents",description = "%configuration.tsserver.watchOptions.watchFile%",enum = { "fixedChunkSizePolling", "fixedPollingInterval", "priorityPollingInterval", "dynamicPriorityPolling", "useFsEvents", "useFsEventsOnParentDirectory" },enumDescriptions = { "%configuration.tsserver.watchOptions.watchFile.fixedChunkSizePolling%", "%configuration.tsserver.watchOptions.watchFile.fixedPollingInterval%", "%configuration.tsserver.watchOptions.watchFile.priorityPollingInterval%", "%configuration.tsserver.watchOptions.watchFile.dynamicPriorityPolling%", "%configuration.tsserver.watchOptions.watchFile.useFsEvents%", "%configuration.tsserver.watchOptions.watchFile.useFsEventsOnParentDirectory%" },type = "string"}},scope = "window",type = "object"},["typescript.updateImportsOnFileMove.enabled"] = {default = "prompt",description = "%typescript.updateImportsOnFileMove.enabled%",enum = { "prompt", "always", "never" },markdownEnumDescriptions = { "%typescript.updateImportsOnFileMove.enabled.prompt%", "%typescript.updateImportsOnFileMove.enabled.always%", "%typescript.updateImportsOnFileMove.enabled.never%" },scope = "resource",type = "string"},["typescript.validate.enable"] = {default = true,description = "%typescript.validate.enable%",scope = "window",type = "boolean"},["typescript.workspaceSymbols.scope"] = {default = "allOpenProjects",enum = { "allOpenProjects", "currentProject" },enumDescriptions = { "%typescript.workspaceSymbols.scope.allOpenProjects%", "%typescript.workspaceSymbols.scope.currentProject%" },markdownDescription = "%typescript.workspaceSymbols.scope%",scope = "window",type = "string"}},title = "%configuration.typescript%",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/vuels.lua b/lua/mason/_generated/lsp-schemas/vetur-vls.lua
index db7c29a7..db7c29a7 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/vuels.lua
+++ b/lua/mason/_generated/lsp-schemas/vetur-vls.lua
diff --git a/lua/nvim-lsp-installer/_generated/schemas/volar.lua b/lua/mason/_generated/lsp-schemas/vue-language-server.lua
index e8d988d7..1a984e7b 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/volar.lua
+++ b/lua/mason/_generated/lsp-schemas/vue-language-server.lua
@@ -1,3 +1,3 @@
-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
-- stylua: ignore start
-return {properties = {["volar-document-features.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["volar-language-features-2.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["volar-language-features.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["volar.autoCompleteRefs"] = {default = false,description = "Auto-complete Ref value with `.value`.",type = "boolean"},["volar.autoWrapParentheses"] = {default = true,description = "Auto-wrap `()` to As Expression in interpolations for fix issue #520.",type = "boolean"},["volar.codeLens.pugTools"] = {default = false,description = "[pug ☐] code lens.",type = "boolean"},["volar.codeLens.references"] = {default = true,description = "[references] code lens.",type = "boolean"},["volar.codeLens.scriptSetupTools"] = {default = false,description = "[ref sugar ☐] code lens.",type = "boolean"},["volar.completion.autoImportComponent"] = {default = true,description = "Enabled auto-import for component with tag completion.",type = "boolean"},["volar.completion.preferredAttrNameCase"] = {default = "auto-kebab",description = "Preferred attr name case.",enum = { "auto-kebab", "auto-camel", "kebab", "camel" },enumDescriptions = { 'Auto Detect from Content (Preferred :kebab-case="...")', 'Auto Detect from Content (Preferred :camelCase="...")', ':kebab-case="..."', ':camelCase="..."' },type = "string"},["volar.completion.preferredTagNameCase"] = {default = "auto",description = "Preferred tag name case.",enum = { "auto", "both", "kebab", "pascal" },enumDescriptions = { "Auto Detect from Content", "<kebab-case> and <PascalCase>", "<kebab-case>", "<PascalCase>" },type = "string"},["volar.icon.preview"] = {default = true,description = "Show Vite / Nuxt App preview icon.",type = "boolean"},["volar.icon.splitEditors"] = {default = true,description = "Show split editor icon in title area of editor.",type = "boolean"},["volar.preview.backgroundColor"] = {default = "#fff",description = "Component preview background color.",type = "string"},["volar.preview.port"] = {default = 3333,description = "Default port for component preview server.",type = "number"},["volar.preview.script.nuxi"] = {default = "node {NUXI_BIN} dev --port {PORT}",type = "string"},["volar.preview.script.vite"] = {default = "node {VITE_BIN} --port={PORT}",type = "string"},["volar.preview.transparentGrid"] = {default = true,description = "Component preview background style.",type = "boolean"},["volar.splitEditors.layout.left"] = {default = { "script", "scriptSetup", "styles" },type = "array"},["volar.splitEditors.layout.right"] = {default = { "template", "customBlocks" },type = "array"},["volar.takeOverMode.enabled"] = {default = "auto",description = "Take over language support for *.ts.",enum = { "auto", true, false },enumDescriptions = { "Auto enable take over mode when built-in TS extension disabled.", "Alway enable take over mode.", "Never enable take over mode." },type = "boolean"},["volar.vueserver.maxOldSpaceSize"] = {default = vim.NIL,description = 'Set --max-old-space-size option on server process. If you have problem on frequently "Request textDocument/** failed." error, try setting higher memory(MB) on it.',type = { "number", "null" }},["volar.vueserver.useSecondServer"] = {default = false,description = "Use second server to progress heavy diagnostic works, the main server workhorse computing intellisense, operations such as auto-complete can respond faster. Note that this will lead to more memory usage.",type = "boolean"}},title = "Volar",type = "object"} \ No newline at end of file
+return {properties = {["volar-document-features.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["volar-language-features-2.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["volar-language-features.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["volar.autoCompleteRefs"] = {default = false,description = "Auto-complete Ref value with `.value`.",type = "boolean"},["volar.autoWrapParentheses"] = {default = true,description = "Auto-wrap `()` to As Expression in interpolations for fix issue #520.",type = "boolean"},["volar.codeLens.pugTools"] = {default = false,description = "[pug ☐] code lens.",type = "boolean"},["volar.codeLens.references"] = {default = true,description = "[references] code lens.",type = "boolean"},["volar.codeLens.scriptSetupTools"] = {default = false,description = "[ref sugar ☐] code lens.",type = "boolean"},["volar.completion.autoImportComponent"] = {default = true,description = "Enabled auto-import for component with tag completion.",type = "boolean"},["volar.completion.preferredAttrNameCase"] = {default = "auto-kebab",description = "Preferred attr name case.",enum = { "auto-kebab", "auto-camel", "kebab", "camel" },enumDescriptions = { 'Auto Detect from Content (Preferred :kebab-case="...")', 'Auto Detect from Content (Preferred :camelCase="...")', ':kebab-case="..."', ':camelCase="..."' },type = "string"},["volar.completion.preferredTagNameCase"] = {default = "auto",description = "Preferred tag name case.",enum = { "auto", "both", "kebab", "pascal" },enumDescriptions = { "Auto Detect from Content", "<kebab-case> and <PascalCase>", "<kebab-case>", "<PascalCase>" },type = "string"},["volar.icon.preview"] = {default = true,description = "Show Vite / Nuxt App preview icon.",type = "boolean"},["volar.icon.splitEditors"] = {default = true,description = "Show split editor icon in title area of editor.",type = "boolean"},["volar.preview.backgroundColor"] = {default = "#f0f0f0",description = "Component preview background color.",type = "string"},["volar.preview.port"] = {default = 3333,description = "Default port for component preview server.",type = "number"},["volar.preview.script.nuxi"] = {default = "node {NUXI_BIN} dev --port {PORT}",type = "string"},["volar.preview.script.vite"] = {default = "node {VITE_BIN} --port={PORT}",type = "string"},["volar.preview.transparentGrid"] = {default = false,description = "Component preview background style.",type = "boolean"},["volar.splitEditors.layout.left"] = {default = { "script", "scriptSetup", "styles" },type = "array"},["volar.splitEditors.layout.right"] = {default = { "template", "customBlocks" },type = "array"},["volar.takeOverMode.enabled"] = {default = "auto",description = "Take over language support for *.ts.",enum = { "auto", true, false },enumDescriptions = { "Auto enable take over mode when built-in TS extension disabled.", "Alway enable take over mode.", "Never enable take over mode." },type = "boolean"},["volar.vueserver.maxOldSpaceSize"] = {default = vim.NIL,description = 'Set --max-old-space-size option on server process. If you have problem on frequently "Request textDocument/** failed." error, try setting higher memory(MB) on it.',type = { "number", "null" }},["volar.vueserver.useSecondServer"] = {default = false,description = "Use second server to progress heavy diagnostic works, the main server workhorse computing intellisense, operations such as auto-complete can respond faster. Note that this will lead to more memory usage.",type = "boolean"}},title = "Volar",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/yamlls.lua b/lua/mason/_generated/lsp-schemas/yaml-language-server.lua
index 311e5cfb..311e5cfb 100644
--- a/lua/nvim-lsp-installer/_generated/schemas/yamlls.lua
+++ b/lua/mason/_generated/lsp-schemas/yaml-language-server.lua
diff --git a/lua/mason/_generated/lsp-schemas/zls.lua b/lua/mason/_generated/lsp-schemas/zls.lua
new file mode 100644
index 00000000..3051bfde
--- /dev/null
+++ b/lua/mason/_generated/lsp-schemas/zls.lua
@@ -0,0 +1,3 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {properties = {["zigLanguageClient.debugLog"] = {description = "Enable debug logging in release builds of zls.",scope = "resource",type = "boolean"},["zigLanguageClient.path"] = {description = "Path to `zls` executable. Example: `C:/zls/zig-cache/bin/zls.exe`.",scope = "resource",type = "string"}},title = "Zig language client configuration",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/filetype_map.lua b/lua/mason/_generated/lspconfig_filetype_map.lua
index 86103c5c..577bfe86 100644
--- a/lua/nvim-lsp-installer/_generated/filetype_map.lua
+++ b/lua/mason/_generated/lspconfig_filetype_map.lua
@@ -15,19 +15,18 @@ return {
bicep = { "bicep" },
blade = { "tailwindcss" },
bsl = { "bsl_ls" },
- c = { "ccls", "clangd", "sourcekit" },
+ c = { "ccls", "clangd" },
clar = { "clarity_lsp" },
clarity = { "clarity_lsp" },
clojure = { "clojure_lsp" },
cmake = { "cmake" },
- cpp = { "ccls", "clangd", "sourcekit" },
+ cpp = { "ccls", "clangd" },
crystal = { "crystalline", "scry" },
cs = { "csharp_ls", "omnisharp" },
css = { "cssls", "emmet_ls", "stylelint_lsp", "tailwindcss" },
cucumber = { "cucumber_language_server" },
cuda = { "clangd" },
d = { "serve_d" },
- dart = { "dartls" },
dhall = { "dhall_lsp_server" },
["django-html"] = { "tailwindcss" },
dockerfile = { "dockerls" },
@@ -94,9 +93,7 @@ return {
nunjucks = { "tailwindcss" },
objc = { "ccls", "clangd" },
objcpp = { "ccls", "clangd" },
- ["objective-c"] = { "sourcekit" },
- ["objective-cpp"] = { "sourcekit" },
- ocaml = { "ocamlls", "ocamllsp" },
+ ocaml = { "ocamllsp" },
["ocaml.interface"] = { "ocamllsp" },
["ocaml.menhir"] = { "ocamllsp" },
["ocaml.ocamllex"] = { "ocamllsp" },
@@ -115,7 +112,7 @@ return {
ql = { "codeqlls" },
r = { "r_language_server" },
razor = { "tailwindcss" },
- reason = { "ocamlls", "ocamllsp", "reason_ls", "tailwindcss" },
+ reason = { "ocamllsp", "reason_ls", "tailwindcss" },
rescript = { "rescriptls", "tailwindcss" },
rmd = { "r_language_server" },
rnoweb = { "ltex" },
@@ -129,13 +126,12 @@ return {
slim = { "tailwindcss" },
slint = { "slint_lsp" },
sls = { "salt_ls" },
- solidity = { "solang", "solc", "solidity_ls" },
+ solidity = { "solang", "solc" },
sql = { "sqlls", "sqls" },
stylus = { "tailwindcss" },
sugarss = { "stylelint_lsp", "tailwindcss" },
svelte = { "svelte", "tailwindcss" },
svg = { "lemminx" },
- swift = { "sourcekit" },
systemverilog = { "svlangserver", "svls", "verible" },
teal = { "teal_ls" },
terraform = { "terraformls", "tflint" },
@@ -153,7 +149,6 @@ return {
vlang = { "vls" },
vmasm = { "asm_lsp" },
vue = { "eslint", "stylelint_lsp", "tailwindcss", "volar", "vuels" },
- wgsl = { "wgsl_analyzer" },
wxss = { "stylelint_lsp" },
xml = { "lemminx" },
xsd = { "lemminx" },
diff --git a/lua/mason/_generated/package_index.lua b/lua/mason/_generated/package_index.lua
new file mode 100644
index 00000000..32dac71c
--- /dev/null
+++ b/lua/mason/_generated/package_index.lua
@@ -0,0 +1,131 @@
+-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
+-- stylua: ignore start
+return {
+ ["angular-language-server"] = "mason.packages.angular-language-server",
+ ["ansible-language-server"] = "mason.packages.ansible-language-server",
+ ["apex-language-server"] = "mason.packages.apex-language-server",
+ ["arduino-language-server"] = "mason.packages.arduino-language-server",
+ ["asm-lsp"] = "mason.packages.asm-lsp",
+ ["astro-language-server"] = "mason.packages.astro-language-server",
+ ["awk-language-server"] = "mason.packages.awk-language-server",
+ ["bash-language-server"] = "mason.packages.bash-language-server",
+ ["beancount-language-server"] = "mason.packages.beancount-language-server",
+ ["bicep-lsp"] = "mason.packages.bicep-lsp",
+ ["bsl-language-server"] = "mason.packages.bsl-language-server",
+ ccls = "mason.packages.ccls",
+ clangd = "mason.packages.clangd",
+ ["clarity-lsp"] = "mason.packages.clarity-lsp",
+ ["clojure-lsp"] = "mason.packages.clojure-lsp",
+ ["cmake-language-server"] = "mason.packages.cmake-language-server",
+ codelldb = "mason.packages.codelldb",
+ codeql = "mason.packages.codeql",
+ cpptools = "mason.packages.cpptools",
+ crystalline = "mason.packages.crystalline",
+ ["csharp-language-server"] = "mason.packages.csharp-language-server",
+ ["css-lsp"] = "mason.packages.css-lsp",
+ ["cssmodules-language-server"] = "mason.packages.cssmodules-language-server",
+ ["cucumber-language-server"] = "mason.packages.cucumber-language-server",
+ debugpy = "mason.packages.debugpy",
+ deno = "mason.packages.deno",
+ ["dhall-lsp"] = "mason.packages.dhall-lsp",
+ ["diagnostic-languageserver"] = "mason.packages.diagnostic-languageserver",
+ ["dockerfile-language-server"] = "mason.packages.dockerfile-language-server",
+ ["dot-language-server"] = "mason.packages.dot-language-server",
+ efm = "mason.packages.efm",
+ ["elixir-ls"] = "mason.packages.elixir-ls",
+ ["elm-format"] = "mason.packages.elm-format",
+ ["elm-language-server"] = "mason.packages.elm-language-server",
+ ["ember-language-server"] = "mason.packages.ember-language-server",
+ ["emmet-ls"] = "mason.packages.emmet-ls",
+ ["erlang-ls"] = "mason.packages.erlang-ls",
+ esbonio = "mason.packages.esbonio",
+ ["eslint-lsp"] = "mason.packages.eslint-lsp",
+ ["flux-lsp"] = "mason.packages.flux-lsp",
+ ["foam-language-server"] = "mason.packages.foam-language-server",
+ fortls = "mason.packages.fortls",
+ fsautocomplete = "mason.packages.fsautocomplete",
+ ["golangci-lint"] = "mason.packages.golangci-lint",
+ ["golangci-lint-langserver"] = "mason.packages.golangci-lint-langserver",
+ gopls = "mason.packages.gopls",
+ ["grammarly-languageserver"] = "mason.packages.grammarly-languageserver",
+ ["graphql-language-service-cli"] = "mason.packages.graphql-language-service-cli",
+ ["groovy-language-server"] = "mason.packages.groovy-language-server",
+ ["haskell-language-server"] = "mason.packages.haskell-language-server",
+ ["haxe-language-server"] = "mason.packages.haxe-language-server",
+ ["hoon-language-server"] = "mason.packages.hoon-language-server",
+ ["html-lsp"] = "mason.packages.html-lsp",
+ intelephense = "mason.packages.intelephense",
+ jdtls = "mason.packages.jdtls",
+ ["jedi-language-server"] = "mason.packages.jedi-language-server",
+ ["json-lsp"] = "mason.packages.json-lsp",
+ ["jsonnet-language-server"] = "mason.packages.jsonnet-language-server",
+ ["julia-lsp"] = "mason.packages.julia-lsp",
+ ["kotlin-language-server"] = "mason.packages.kotlin-language-server",
+ lelwel = "mason.packages.lelwel",
+ lemminx = "mason.packages.lemminx",
+ ["lemmy-help"] = "mason.packages.lemmy-help",
+ ["ltex-ls"] = "mason.packages.ltex-ls",
+ ["lua-language-server"] = "mason.packages.lua-language-server",
+ marksman = "mason.packages.marksman",
+ ["metamath-zero-lsp"] = "mason.packages.metamath-zero-lsp",
+ mockdebug = "mason.packages.mockdebug",
+ ["nickel-lang-lsp"] = "mason.packages.nickel-lang-lsp",
+ nimlsp = "mason.packages.nimlsp",
+ ["ocaml-lsp"] = "mason.packages.ocaml-lsp",
+ ["omnisharp-roslyn"] = "mason.packages.omnisharp-roslyn",
+ ["opencl-language-server"] = "mason.packages.opencl-language-server",
+ perlnavigator = "mason.packages.perlnavigator",
+ phpactor = "mason.packages.phpactor",
+ ["powershell-editor-services"] = "mason.packages.powershell-editor-services",
+ ["prisma-language-server"] = "mason.packages.prisma-language-server",
+ ["prosemd-lsp"] = "mason.packages.prosemd-lsp",
+ psalm = "mason.packages.psalm",
+ ["puppet-editor-services"] = "mason.packages.puppet-editor-services",
+ ["purescript-language-server"] = "mason.packages.purescript-language-server",
+ pyright = "mason.packages.pyright",
+ ["python-lsp-server"] = "mason.packages.python-lsp-server",
+ ["quick-lint-js"] = "mason.packages.quick-lint-js",
+ ["r-languageserver"] = "mason.packages.r-languageserver",
+ ["reason-language-server"] = "mason.packages.reason-language-server",
+ ["remark-language-server"] = "mason.packages.remark-language-server",
+ ["rescript-lsp"] = "mason.packages.rescript-lsp",
+ ["rnix-lsp"] = "mason.packages.rnix-lsp",
+ ["robotframework-lsp"] = "mason.packages.robotframework-lsp",
+ rome = "mason.packages.rome",
+ ["rust-analyzer"] = "mason.packages.rust-analyzer",
+ ["salt-lsp"] = "mason.packages.salt-lsp",
+ ["serve-d"] = "mason.packages.serve-d",
+ shellcheck = "mason.packages.shellcheck",
+ ["shopify-theme-check"] = "mason.packages.shopify-theme-check",
+ ["slint-lsp"] = "mason.packages.slint-lsp",
+ solang = "mason.packages.solang",
+ solargraph = "mason.packages.solargraph",
+ solidity = "mason.packages.solidity",
+ sorbet = "mason.packages.sorbet",
+ sourcery = "mason.packages.sourcery",
+ sqlls = "mason.packages.sqlls",
+ sqls = "mason.packages.sqls",
+ ["stylelint-lsp"] = "mason.packages.stylelint-lsp",
+ stylua = "mason.packages.stylua",
+ ["svelte-language-server"] = "mason.packages.svelte-language-server",
+ svlangserver = "mason.packages.svlangserver",
+ svls = "mason.packages.svls",
+ ["tailwindcss-language-server"] = "mason.packages.tailwindcss-language-server",
+ taplo = "mason.packages.taplo",
+ ["teal-language-server"] = "mason.packages.teal-language-server",
+ ["terraform-ls"] = "mason.packages.terraform-ls",
+ texlab = "mason.packages.texlab",
+ tflint = "mason.packages.tflint",
+ ["typescript-language-server"] = "mason.packages.typescript-language-server",
+ ["vala-language-server"] = "mason.packages.vala-language-server",
+ verible = "mason.packages.verible",
+ ["vetur-vls"] = "mason.packages.vetur-vls",
+ ["vim-language-server"] = "mason.packages.vim-language-server",
+ ["visualforce-language-server"] = "mason.packages.visualforce-language-server",
+ vls = "mason.packages.vls",
+ ["vue-language-server"] = "mason.packages.vue-language-server",
+ ["wgsl-analyzer"] = "mason.packages.wgsl-analyzer",
+ ["yaml-language-server"] = "mason.packages.yaml-language-server",
+ zk = "mason.packages.zk",
+ zls = "mason.packages.zls"
+} \ No newline at end of file
diff --git a/lua/mason/command-api/init.lua b/lua/mason/command-api/init.lua
new file mode 100644
index 00000000..42e0e2fc
--- /dev/null
+++ b/lua/mason/command-api/init.lua
@@ -0,0 +1,81 @@
+local notify = require "mason.notify"
+
+local M = {}
+
+vim.api.nvim_create_user_command("Mason", function()
+ require("mason.ui").open()
+end, {
+ desc = "Opens mason's UI window.",
+ nargs = 0,
+})
+
+vim.api.nvim_create_user_command("MasonInstall", function(opts)
+ local Package = require "mason.core.package"
+ local indexer = require "mason.core.package.indexer"
+ for _, package_specifier in ipairs(opts.fargs) do
+ ---@type string
+ local package_name, version = Package.Parse(package_specifier)
+ local ok, pkg = pcall(indexer.get_package, package_name)
+ if not ok then
+ notify(("Cannot find package %q."):format(package_name), vim.log.levels.ERROR)
+ return
+ end
+ local handle = pkg:install { version = version }
+ require("mason.ui").open()
+ end
+end, {
+ desc = "Install one or more packages.",
+ nargs = "+",
+ complete = "custom,v:lua.mason_completion.available_package_completion",
+})
+
+vim.api.nvim_create_user_command("MasonUninstall", function(opts)
+ local indexer = require "mason.core.package.indexer"
+ for _, package_name in ipairs(opts.fargs) do
+ local ok, pkg = pcall(indexer.get_package, package_name)
+ if not ok then
+ notify(("Cannot find package %q."):format(package_name), vim.log.levels.ERROR)
+ return
+ end
+ pkg:uninstall()
+ require("mason.ui").open()
+ end
+end, {
+ desc = "Uninstall one or more packages.",
+ nargs = "+",
+ complete = "custom,v:lua.mason_completion.installed_package_completion",
+})
+
+vim.api.nvim_create_user_command("MasonUninstallAll", function()
+ local indexer = require "mason.core.package.indexer"
+ require("mason.ui").open()
+ for _, pkg in ipairs(indexer.get_installed_packages()) do
+ pkg:uninstall()
+ end
+end, {
+ desc = "Uninstall all packages.",
+})
+
+vim.api.nvim_create_user_command("MasonLog", function()
+ local log = require "mason.log"
+ vim.cmd(([[tabnew %s]]):format(log.outfile))
+end, {
+ desc = "Opens the mason.nvim log.",
+})
+
+_G.mason_completion = {
+ available_package_completion = function()
+ local indexer = require "mason.core.package.indexer"
+ local package_names = indexer.get_all_package_names()
+ table.sort(package_names)
+ return table.concat(package_names, "\n")
+ end,
+ installed_package_completion = function()
+ local indexer = require "mason.core.package.indexer"
+ local package_names = indexer.get_installed_package_names()
+ table.sort(package_names)
+ return table.concat(package_names, "\n")
+ end,
+}
+
+return M
diff --git a/lua/mason/core/EventEmitter.lua b/lua/mason/core/EventEmitter.lua
new file mode 100644
index 00000000..672c1778
--- /dev/null
+++ b/lua/mason/core/EventEmitter.lua
@@ -0,0 +1,64 @@
+---@class EventEmitter
+---@field private __event_handlers table<any, table<fun(), fun()>>
+---@field private __event_handlers_once table<any, table<fun(), fun()>>
+local EventEmitter = {}
+EventEmitter.__index = EventEmitter
+
+---@generic T
+---@param obj T
+---@return T
+function EventEmitter.init(obj)
+ obj.__event_handlers = {}
+ obj.__event_handlers_once = {}
+ return obj
+end
+
+---@param event any
+function EventEmitter:emit(event, ...)
+ if self.__event_handlers[event] then
+ for handler in pairs(self.__event_handlers[event]) do
+ pcall(handler, ...)
+ end
+ end
+ if self.__event_handlers_once[event] then
+ for handler in pairs(self.__event_handlers_once[event]) do
+ pcall(handler, ...)
+ self.__event_handlers_once[handler] = nil
+ end
+ end
+end
+
+---@param event any
+---@param handler fun(payload: any)
+function EventEmitter:on(event, handler)
+ if not self.__event_handlers[event] then
+ self.__event_handlers[event] = {}
+ end
+ self.__event_handlers[event][handler] = handler
+end
+
+---@param event any
+---@parma handler fun(payload: any)
+function EventEmitter:once(event, handler)
+ if not self.__event_handlers_once[event] then
+ self.__event_handlers_once[event] = {}
+ end
+ self.__event_handlers_once[event][handler] = handler
+end
+
+---@param event any
+---@param handler fun(payload: any)
+function EventEmitter:off(event, handler)
+ if vim.tbl_get(self.__event_handlers, { event, handler }) then
+ self.__event_handlers[event][handler] = nil
+ return true
+ end
+ return false
+end
+
+function EventEmitter:clear_event_handlers()
+ self.__event_handlers = {}
+ self.__event_handlers_once = {}
+end
+
+return EventEmitter
diff --git a/lua/mason/core/async/control.lua b/lua/mason/core/async/control.lua
new file mode 100644
index 00000000..9ecba8f4
--- /dev/null
+++ b/lua/mason/core/async/control.lua
@@ -0,0 +1,75 @@
+local a = require "mason.core.async"
+
+---@class Condvar
+local Condvar = {}
+Condvar.__index = Condvar
+
+function Condvar.new()
+ return setmetatable({ handles = {}, queue = {}, is_notifying = false }, Condvar)
+end
+
+---@async
+function Condvar:wait()
+ a.wait(function(resolve)
+ if self.is_notifying then
+ self.queue[resolve] = true
+ else
+ self.handles[resolve] = true
+ end
+ end)
+end
+
+function Condvar:notify_all()
+ self.is_notifying = true
+ for handle in pairs(self.handles) do
+ handle()
+ end
+ self.handles = self.queue
+ self.queue = {}
+ self.is_notifying = false
+end
+
+local Permit = {}
+Permit.__index = Permit
+
+function Permit.new(semaphore)
+ return setmetatable({ semaphore = semaphore }, Permit)
+end
+
+function Permit:forget()
+ local semaphore = self.semaphore
+ semaphore.permits = semaphore.permits + 1
+
+ if semaphore.permits > 0 and #semaphore.handles > 0 then
+ semaphore.permits = semaphore.permits - 1
+ local release = table.remove(semaphore.handles, 1)
+ release(Permit.new(semaphore))
+ end
+end
+
+---@class Semaphore
+local Semaphore = {}
+Semaphore.__index = Semaphore
+
+---@param permits integer
+function Semaphore.new(permits)
+ return setmetatable({ permits = permits, handles = {} }, Semaphore)
+end
+
+---@async
+function Semaphore:acquire()
+ if self.permits > 0 then
+ self.permits = self.permits - 1
+ else
+ return a.wait(function(resolve)
+ table.insert(self.handles, resolve)
+ end)
+ end
+
+ return Permit.new(self)
+end
+
+return {
+ Condvar = Condvar,
+ Semaphore = Semaphore,
+}
diff --git a/lua/nvim-lsp-installer/core/async/init.lua b/lua/mason/core/async/init.lua
index 5c82e64a..3f5d1359 100644
--- a/lua/nvim-lsp-installer/core/async/init.lua
+++ b/lua/mason/core/async/init.lua
@@ -1,4 +1,4 @@
-local functional = require "nvim-lsp-installer.core.functional"
+local _ = require "mason.core.functional"
local co = coroutine
local exports = {}
@@ -101,6 +101,9 @@ exports.run = function(suspend_fn, callback, ...)
return new_execution_context(suspend_fn, callback, ...)
end
+---@generic T
+---@param suspend_fn T
+---@return T
exports.scope = function(suspend_fn)
return function(...)
return new_execution_context(suspend_fn, function(success, err)
@@ -177,7 +180,8 @@ end
---@async
---@param suspend_fns async fun()[]
-exports.wait_all = function(suspend_fns)
+---@param mode '"first"' | '"all"'
+local function wait(suspend_fns, mode)
local channel = oneshot_channel()
do
@@ -186,22 +190,27 @@ exports.wait_all = function(suspend_fns)
local count = #suspend_fns
local completed = 0
+ local function cancel()
+ for _, cancel_thread in ipairs(thread_cancellations) do
+ cancel_thread()
+ end
+ end
+
for i, suspend_fn in ipairs(suspend_fns) do
thread_cancellations[i] = exports.run(suspend_fn, function(success, result)
completed = completed + 1
if not success then
if not channel.is_closed() then
- for _, cancel_thread in ipairs(thread_cancellations) do
- cancel_thread()
- end
+ cancel()
channel.send(false, result)
results = nil
thread_cancellations = {}
end
else
results[i] = result
- if completed >= count then
- channel.send(true, results)
+ if mode == "first" or completed >= count then
+ cancel()
+ channel.send(true, mode == "first" and { result } or results)
results = nil
thread_cancellations = {}
end
@@ -217,8 +226,20 @@ exports.wait_all = function(suspend_fns)
return unpack(results)
end
+---@async
+---@param suspend_fns async fun()[]
+function exports.wait_all(suspend_fns)
+ return wait(suspend_fns, "all")
+end
+
+---@async
+---@param suspend_fns async fun()[]
+function exports.wait_first(suspend_fns)
+ return wait(suspend_fns, "first")
+end
+
function exports.blocking(suspend_fn)
- return functional.partial(exports.run_blocking, suspend_fn)
+ return _.partial(exports.run_blocking, suspend_fn)
end
return exports
diff --git a/lua/nvim-lsp-installer/core/async/uv.lua b/lua/mason/core/async/uv.lua
index 69af4f26..3c0e5999 100644
--- a/lua/nvim-lsp-installer/core/async/uv.lua
+++ b/lua/mason/core/async/uv.lua
@@ -1,4 +1,4 @@
-local a = require "nvim-lsp-installer.core.async"
+local a = require "mason.core.async"
---@type table<UvMethod, async fun(...)>
local M = setmetatable({}, {
diff --git a/lua/nvim-lsp-installer/core/clients/eclipse.lua b/lua/mason/core/clients/eclipse.lua
index 0d169d9d..281d191a 100644
--- a/lua/nvim-lsp-installer/core/clients/eclipse.lua
+++ b/lua/mason/core/clients/eclipse.lua
@@ -1,4 +1,4 @@
-local fetch = require "nvim-lsp-installer.core.fetch"
+local fetch = require "mason.core.fetch"
local M = {}
---@param version string The version string as found in the latest.txt endpoint.
diff --git a/lua/mason/core/fetch.lua b/lua/mason/core/fetch.lua
new file mode 100644
index 00000000..ba9dd9a7
--- /dev/null
+++ b/lua/mason/core/fetch.lua
@@ -0,0 +1,122 @@
+local log = require "mason.log"
+local platform = require "mason.core.platform"
+local Result = require "mason.core.result"
+local spawn = require "mason.core.spawn"
+local powershell = require "mason.core.managers.powershell"
+local _ = require "mason.core.functional"
+
+local USER_AGENT = "mason.nvim (+https://github.com/williamboman/mason.nvim)"
+
+---@alias FetchMethod
+---| '"GET"'
+---| '"POST"'
+---| '"PUT"'
+---| '"PATCH"'
+---| '"DELETE"'
+
+---@alias FetchOpts {out_file: string, method: FetchMethod, headers: table<string, string>, data: string}
+
+---@async
+---@param url string @The url to fetch.
+---@param opts FetchOpts | nil
+local function fetch(url, opts)
+ opts = opts or {}
+ if not opts.headers then
+ opts.headers = {}
+ end
+ if not opts.method then
+ opts.method = "GET"
+ end
+ opts.headers["User-Agent"] = USER_AGENT
+ log.fmt_debug("Fetching URL %s", url)
+
+ local platform_specific = Result.failure()
+
+ if platform.is_win then
+ local header_entries = _.join(
+ ", ",
+ _.map(function(pair)
+ return ("%q = %q"):format(pair[1], pair[2])
+ end, _.to_pairs(opts.headers))
+ )
+ local headers = ("@{%s}"):format(header_entries)
+ if opts.out_file then
+ platform_specific = powershell.command(
+ ([[iwr %s -UseBasicParsing -Method %q -Uri %q %s -OutFile %q;]]):format(
+ headers,
+ opts.method,
+ url,
+ opts.data and ("-Body %s"):format(opts.data) or "",
+ opts.out_file
+ )
+ )
+ else
+ platform_specific = powershell.command(
+ ([[Write-Output (iwr %s -Method %q -UseBasicParsing %s -Uri %q).Content;]]):format(
+ headers,
+ opts.method,
+ opts.data and ("-Body %s"):format(opts.data) or "",
+ url
+ )
+ )
+ end
+ end
+
+ return platform_specific
+ :recover_catching(function()
+ local headers = _.sort_by(
+ _.identity,
+ _.map(_.compose(_.format "--header='%s'", _.join ": "), _.to_pairs(opts.headers))
+ )
+ return spawn.wget({
+ headers,
+ "-nv",
+ "-O",
+ opts.out_file or "-",
+ ("--method=%s"):format(opts.method),
+ opts.data and {
+ ("--body-data=%s"):format(opts.data) or vim.NIL,
+ } or vim.NIL,
+ url,
+ }):get_or_throw()
+ end)
+ :recover_catching(function()
+ local headers = _.sort_by(
+ _.nth(2),
+ _.map(
+ _.compose(function(header)
+ return { "-H", header }
+ end, _.join ": "),
+ _.to_pairs(opts.headers)
+ )
+ )
+ return spawn.curl({
+ headers,
+ "-fsSL",
+ {
+ "-X",
+ opts.method,
+ },
+ opts.data and { "-d", "@-" } or vim.NIL,
+ opts.out_file and { "-o", opts.out_file } or vim.NIL,
+ url,
+ on_spawn = function(_, stdio)
+ local stdin = stdio[1]
+ if opts.data then
+ log.trace("Writing stdin to curl", opts.data)
+ stdin:write(opts.data)
+ end
+ stdin:close()
+ end,
+ }):get_or_throw()
+ end)
+ :map(function(result)
+ if opts.out_file then
+ return result
+ else
+ return result.stdout
+ end
+ end)
+end
+
+return fetch
diff --git a/lua/nvim-lsp-installer/core/fs.lua b/lua/mason/core/fs.lua
index 08e6f04f..77d266ca 100644
--- a/lua/nvim-lsp-installer/core/fs.lua
+++ b/lua/mason/core/fs.lua
@@ -1,7 +1,7 @@
-local log = require "nvim-lsp-installer.log"
-local a = require "nvim-lsp-installer.core.async"
-local Path = require "nvim-lsp-installer.core.path"
-local settings = require "nvim-lsp-installer.settings"
+local log = require "mason.log"
+local a = require "mason.core.async"
+local Path = require "mason.core.path"
+local settings = require "mason.settings"
local function make_module(uv)
local M = {}
@@ -40,7 +40,7 @@ local function make_module(uv)
assert(
Path.is_subdirectory(settings.current.install_root_dir, path),
(
- "Refusing to rmrf %q which is outside of the allowed boundary %q. Please report this error at https://github.com/williamboman/nvim-lsp-installer/issues/new"
+ "Refusing to rmrf %q which is outside of the allowed boundary %q. Please report this error at https://github.com/williamboman/mason.nvim/issues/new"
):format(path, settings.current.install_root_dir)
)
log.debug("fs: rmrf", path)
@@ -116,7 +116,7 @@ local function make_module(uv)
---@return ReaddirEntry[]
function M.readdir(path)
log.trace("fs: fs_opendir", path)
- local dir = vim.loop.fs_opendir(path, nil, 25)
+ local dir = assert(vim.loop.fs_opendir(path, nil, 25))
local all_entries = {}
local exhausted = false
@@ -138,10 +138,15 @@ local function make_module(uv)
return all_entries
end
+ function M.symlink(path, new_path)
+ log.trace("fs: symlink", path, new_path)
+ uv.fs_symlink(path, new_path)
+ end
+
return M
end
return {
- async = make_module(require "nvim-lsp-installer.core.async.uv"),
+ async = make_module(require "mason.core.async.uv"),
sync = make_module(vim.loop),
}
diff --git a/lua/nvim-lsp-installer/core/functional/data.lua b/lua/mason/core/functional/data.lua
index da6f1efd..da6f1efd 100644
--- a/lua/nvim-lsp-installer/core/functional/data.lua
+++ b/lua/mason/core/functional/data.lua
diff --git a/lua/nvim-lsp-installer/core/functional/function.lua b/lua/mason/core/functional/function.lua
index 0d70aa92..c3de6314 100644
--- a/lua/nvim-lsp-installer/core/functional/function.lua
+++ b/lua/mason/core/functional/function.lua
@@ -1,4 +1,4 @@
-local data = require "nvim-lsp-installer.core.functional.data"
+local data = require "mason.core.functional.data"
local _ = {}
diff --git a/lua/nvim-lsp-installer/core/functional/init.lua b/lua/mason/core/functional/init.lua
index 3e29037f..cd28ecb7 100644
--- a/lua/nvim-lsp-installer/core/functional/init.lua
+++ b/lua/mason/core/functional/init.lua
@@ -1,13 +1,13 @@
local _ = {}
-- data
-local data = require "nvim-lsp-installer.core.functional.data"
+local data = require "mason.core.functional.data"
_.table_pack = data.table_pack
_.enum = data.enum
_.set_of = data.set_of
-- function
-local fun = require "nvim-lsp-installer.core.functional.function"
+local fun = require "mason.core.functional.function"
_.curryN = fun.curryN
_.compose = fun.compose
_.partial = fun.partial
@@ -19,7 +19,7 @@ _.memoize = fun.memoize
_.lazy = fun.lazy
-- list
-local list = require "nvim-lsp-installer.core.functional.list"
+local list = require "mason.core.functional.list"
_.reverse = list.reverse
_.list_not_nil = list.list_not_nil
_.list_copy = list.list_copy
@@ -27,29 +27,36 @@ _.find_first = list.find_first
_.any = list.any
_.filter = list.filter
_.map = list.map
+_.filter_map = list.filter_map
_.each = list.each
_.concat = list.concat
+_.append = list.append
+_.prepend = list.prepend
_.zip_table = list.zip_table
_.nth = list.nth
_.head = list.head
_.length = list.length
+_.flatten = list.flatten
+_.sort_by = list.sort_by
+_.join = list.join
-- relation
-local relation = require "nvim-lsp-installer.core.functional.relation"
+local relation = require "mason.core.functional.relation"
_.equals = relation.equals
_.prop_eq = relation.prop_eq
_.prop_satisfies = relation.prop_satisfies
-- logic
-local logic = require "nvim-lsp-installer.core.functional.logic"
+local logic = require "mason.core.functional.logic"
_.all_pass = logic.all_pass
+_.any_pass = logic.any_pass
_.if_else = logic.if_else
_.is_not = logic.is_not
_.complement = logic.complement
_.cond = logic.cond
-- number
-local number = require "nvim-lsp-installer.core.functional.number"
+local number = require "mason.core.functional.number"
_.negate = number.negate
_.gt = number.gt
_.gte = number.gte
@@ -59,18 +66,25 @@ _.inc = number.inc
_.dec = number.dec
-- string
-local string = require "nvim-lsp-installer.core.functional.string"
+local string = require "mason.core.functional.string"
_.matches = string.matches
_.format = string.format
_.split = string.split
_.gsub = string.gsub
+_.trim = string.trim
+_.dedent = string.dedent
-- table
-local tbl = require "nvim-lsp-installer.core.functional.table"
+local tbl = require "mason.core.functional.table"
_.prop = tbl.prop
+_.pick = tbl.pick
+_.keys = tbl.keys
+_.size = tbl.size
+_.to_pairs = tbl.to_pairs
+_.invert = tbl.invert
-- type
-local typ = require "nvim-lsp-installer.core.functional.type"
+local typ = require "mason.core.functional.type"
_.is_nil = typ.is_nil
_.is = typ.is
diff --git a/lua/nvim-lsp-installer/core/functional/list.lua b/lua/mason/core/functional/list.lua
index 89393cfb..79113433 100644
--- a/lua/nvim-lsp-installer/core/functional/list.lua
+++ b/lua/mason/core/functional/list.lua
@@ -1,5 +1,5 @@
-local fun = require "nvim-lsp-installer.core.functional.function"
-local data = require "nvim-lsp-installer.core.functional.data"
+local fun = require "mason.core.functional.function"
+local data = require "mason.core.functional.data"
local _ = {}
@@ -54,15 +54,29 @@ _.any = fun.curryN(function(predicate, list)
end, 2)
---@generic T
----@param filter_fn fun(item: T): boolean
----@return fun(list: T[]): T[]
+---@type fun(filter_fn: (fun(item: T): boolean), items: T[]): T[]
_.filter = fun.curryN(vim.tbl_filter, 2)
----@generic T
----@param map_fn fun(item: T): boolean
----@return fun(list: T[]): T[]
+---@generic T, U
+---@type fun(map_fn: (fun(item: T): U), items: T[]): U[]
_.map = fun.curryN(vim.tbl_map, 2)
+_.flatten = fun.curryN(vim.tbl_flatten, 1)
+
+---@generic T
+---@param map_fn fun(item: T): Optional
+---@param list T[]
+---@return any[]
+_.filter_map = fun.curryN(function(map_fn, list)
+ local ret = {}
+ for i = 1, #list do
+ map_fn(list[i]):if_present(function(value)
+ ret[#ret + 1] = value
+ end)
+ end
+ return ret
+end, 2)
+
---@generic T
---@param fn fun(item: T, index: integer)
---@param list T[]
@@ -88,6 +102,26 @@ _.concat = fun.curryN(function(a, b)
end, 2)
---@generic T
+---@param value T
+---@param list T[]
+---@return T[]
+_.append = fun.curryN(function(value, list)
+ local list_copy = _.list_copy(list)
+ list_copy[#list_copy + 1] = value
+ return list_copy
+end, 2)
+
+---@generic T
+---@param value T
+---@param list T[]
+---@return T[]
+_.prepend = fun.curryN(function(value, list)
+ local list_copy = _.list_copy(list)
+ table.insert(list_copy, 1, value)
+ return list_copy
+end, 2)
+
+---@generic T
---@generic U
---@param keys T[]
---@param values U[]
@@ -120,4 +154,22 @@ _.length = function(value)
return #value
end
+---@generic T
+---@param comp fun(item: T): any
+---@param list T[]
+---@return T[]
+_.sort_by = fun.curryN(function(comp, list)
+ local copied_list = _.list_copy(list)
+ table.sort(copied_list, function(a, b)
+ return comp(a) < comp(b)
+ end)
+ return copied_list
+end, 2)
+
+---@param sep string
+---@param list any[]
+_.join = fun.curryN(function(sep, list)
+ return table.concat(list, sep)
+end, 2)
+
return _
diff --git a/lua/nvim-lsp-installer/core/functional/logic.lua b/lua/mason/core/functional/logic.lua
index 70b349dd..92fe2d8a 100644
--- a/lua/nvim-lsp-installer/core/functional/logic.lua
+++ b/lua/mason/core/functional/logic.lua
@@ -1,4 +1,4 @@
-local fun = require "nvim-lsp-installer.core.functional.function"
+local fun = require "mason.core.functional.function"
local _ = {}
@@ -15,15 +15,27 @@ _.all_pass = fun.curryN(function(predicates, item)
end, 2)
---@generic T
+---@param predicates (fun(item: T): boolean)[]
+---@return fun(item: T): boolean
+_.any_pass = fun.curryN(function(predicates, item)
+ for i = 1, #predicates do
+ if predicates[i](item) then
+ return true
+ end
+ end
+ return false
+end, 2)
+
+---@generic T
---@param predicate fun(item: T): boolean
----@param a fun(item: T): any
----@param b fun(item: T): any
+---@param on_true fun(item: T): any
+---@param on_false fun(item: T): any
---@param value T
-_.if_else = fun.curryN(function(predicate, a, b, value)
+_.if_else = fun.curryN(function(predicate, on_true, on_false, value)
if predicate(value) then
- return a(value)
+ return on_true(value)
else
- return b(value)
+ return on_false(value)
end
end, 4)
diff --git a/lua/nvim-lsp-installer/core/functional/number.lua b/lua/mason/core/functional/number.lua
index b123eb20..efc1ec20 100644
--- a/lua/nvim-lsp-installer/core/functional/number.lua
+++ b/lua/mason/core/functional/number.lua
@@ -1,4 +1,4 @@
-local fun = require "nvim-lsp-installer.core.functional.function"
+local fun = require "mason.core.functional.function"
local _ = {}
diff --git a/lua/nvim-lsp-installer/core/functional/relation.lua b/lua/mason/core/functional/relation.lua
index d9786a6a..6309ce0b 100644
--- a/lua/nvim-lsp-installer/core/functional/relation.lua
+++ b/lua/mason/core/functional/relation.lua
@@ -1,4 +1,4 @@
-local fun = require "nvim-lsp-installer.core.functional.function"
+local fun = require "mason.core.functional.function"
local _ = {}
diff --git a/lua/mason/core/functional/string.lua b/lua/mason/core/functional/string.lua
new file mode 100644
index 00000000..8a5817a8
--- /dev/null
+++ b/lua/mason/core/functional/string.lua
@@ -0,0 +1,68 @@
+local fun = require "mason.core.functional.function"
+
+local _ = {}
+
+---@param pattern string
+---@param str string
+_.matches = fun.curryN(function(pattern, str)
+ return str:match(pattern) ~= nil
+end, 2)
+
+---@param template string
+---@param str string
+_.format = fun.curryN(function(template, str)
+ return template:format(str)
+end, 2)
+
+---@param sep string
+---@param str string
+_.split = fun.curryN(function(sep, str)
+ return vim.split(str, sep)
+end, 2)
+
+---@param pattern string
+---@param repl string|function|table
+---@param str string
+_.gsub = fun.curryN(function(pattern, repl, str)
+ return string.gsub(str, pattern, repl)
+end, 3)
+
+_.trim = fun.curryN(function(str)
+ return vim.trim(str)
+end, 1)
+
+---https://github.com/nvim-lua/nvim-package-specification/blob/93475e47545b579fd20b6c5ce13c4163e7956046/lua/packspec/schema.lua#L8-L37
+---@param str string
+---@return string
+_.dedent = fun.curryN(function(str)
+ local lines = {}
+ local indent = nil
+
+ for line in str:gmatch "[^\n]*\n?" do
+ if indent == nil then
+ if not line:match "^%s*$" then
+ -- save pattern for indentation from the first non-empty line
+ indent, line = line:match "^(%s*)(.*)$"
+ indent = "^" .. indent .. "(.*)$"
+ table.insert(lines, line)
+ end
+ else
+ if line:match "^%s*$" then
+ -- replace empty lines with a single newline character.
+ -- empty lines are handled separately to allow the
+ -- closing "]]" to be one indentation level lower.
+ table.insert(lines, "\n")
+ else
+ -- strip indentation on non-empty lines
+ line = assert(line:match(indent), "inconsistent indentation")
+ table.insert(lines, line)
+ end
+ end
+ end
+
+ lines = table.concat(lines)
+ -- trim trailing whitespace
+ return lines:match "^(.-)%s*$"
+end, 1)
+
+return _
diff --git a/lua/mason/core/functional/table.lua b/lua/mason/core/functional/table.lua
new file mode 100644
index 00000000..cb9ea171
--- /dev/null
+++ b/lua/mason/core/functional/table.lua
@@ -0,0 +1,45 @@
+local fun = require "mason.core.functional.function"
+
+local _ = {}
+
+---@param index any
+---@param tbl table
+_.prop = fun.curryN(function(index, tbl)
+ return tbl[index]
+end, 2)
+
+---@param keys any[]
+---@param tbl table
+_.pick = fun.curryN(function(keys, tbl)
+ local ret = {}
+ for _, key in ipairs(keys) do
+ ret[key] = tbl[key]
+ end
+ return ret
+end, 2)
+
+_.keys = fun.curryN(vim.tbl_keys, 1)
+_.size = fun.curryN(vim.tbl_count, 1)
+
+---@param tbl table<any, any>
+---@return any[][]
+_.to_pairs = fun.curryN(function(tbl)
+ local result = {}
+ for k, v in pairs(tbl) do
+ result[#result + 1] = { k, v }
+ end
+ return result
+end, 1)
+
+---@generic K, V
+---@param tbl table<K, V>
+---@return table<V, K>
+_.invert = fun.curryN(function(tbl)
+ local result = {}
+ for k, v in pairs(tbl) do
+ result[v] = k
+ end
+ return result
+end, 1)
+
+return _
diff --git a/lua/nvim-lsp-installer/core/functional/type.lua b/lua/mason/core/functional/type.lua
index 23d961ba..878538e0 100644
--- a/lua/nvim-lsp-installer/core/functional/type.lua
+++ b/lua/mason/core/functional/type.lua
@@ -1,5 +1,5 @@
-local fun = require "nvim-lsp-installer.core.functional.function"
-local rel = require "nvim-lsp-installer.core.functional.relation"
+local fun = require "mason.core.functional.function"
+local rel = require "mason.core.functional.relation"
local _ = {}
diff --git a/lua/mason/core/installer/context.lua b/lua/mason/core/installer/context.lua
new file mode 100644
index 00000000..ea5a7b90
--- /dev/null
+++ b/lua/mason/core/installer/context.lua
@@ -0,0 +1,262 @@
+local spawn = require "mason.core.spawn"
+local log = require "mason.log"
+local fs = require "mason.core.fs"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local receipt = require "mason.core.receipt"
+local Optional = require "mason.core.optional"
+local _ = require "mason.core.functional"
+
+---@class ContextualSpawn
+---@field cwd CwdManager
+---@field handle InstallHandle
+local ContextualSpawn = {}
+
+---@param cwd CwdManager
+---@param handle InstallHandle
+function ContextualSpawn.new(cwd, handle)
+ return setmetatable({ cwd = cwd, handle = handle }, ContextualSpawn)
+end
+
+function ContextualSpawn.__index(self, cmd)
+ return function(args)
+ args.cwd = args.cwd or self.cwd:get()
+ args.stdio_sink = args.stdio_sink or self.handle.stdio.sink
+ local on_spawn = args.on_spawn
+ local captured_handle
+ args.on_spawn = function(handle, stdio, pid, ...)
+ captured_handle = handle
+ self.handle:push_spawninfo(handle, pid, cmd, spawn._flatten_cmd_args(args))
+ if on_spawn then
+ on_spawn(handle, stdio, pid, ...)
+ end
+ end
+ local function pop_spawn_stack()
+ if captured_handle then
+ self.handle:pop_spawninfo(captured_handle)
+ end
+ end
+ -- We get_or_throw() here for convenience reasons.
+ -- Almost every time spawn is called via context we want the command to succeed.
+ return spawn[cmd](args):on_success(pop_spawn_stack):on_failure(pop_spawn_stack):get_or_throw()
+ end
+end
+
+---@class ContextualFs
+---@field private cwd CwdManager
+local ContextualFs = {}
+ContextualFs.__index = ContextualFs
+
+---@param cwd CwdManager
+function ContextualFs.new(cwd)
+ return setmetatable({ cwd = cwd }, ContextualFs)
+end
+
+---@async
+---@param rel_path string @The relative path from the current working directory to the file to append.
+---@param contents string
+function ContextualFs:append_file(rel_path, contents)
+ return fs.async.append_file(path.concat { self.cwd:get(), rel_path }, contents)
+end
+
+---@async
+---@param rel_path string @The relative path from the current working directory to the file to write.
+---@param contents string
+function ContextualFs:write_file(rel_path, contents)
+ return fs.async.write_file(path.concat { self.cwd:get(), rel_path }, contents)
+end
+
+---@async
+---@param rel_path string @The relative path from the current working directory.
+function ContextualFs:file_exists(rel_path)
+ return fs.async.file_exists(path.concat { self.cwd:get(), rel_path })
+end
+
+---@async
+---@param rel_path string @The relative path from the current working directory.
+function ContextualFs:dir_exists(rel_path)
+ return fs.async.dir_exists(path.concat { self.cwd:get(), rel_path })
+end
+
+---@async
+---@param rel_path string @The relative path from the current working directory.
+function ContextualFs:rmrf(rel_path)
+ return fs.async.rmrf(path.concat { self.cwd:get(), rel_path })
+end
+
+---@async
+---@param rel_path string @The relative path from the current working directory.
+function ContextualFs:unlink(rel_path)
+ return fs.async.unlink(path.concat { self.cwd:get(), rel_path })
+end
+
+---@async
+---@param old_path string
+---@param new_path string
+function ContextualFs:rename(old_path, new_path)
+ return fs.async.rename(path.concat { self.cwd:get(), old_path }, path.concat { self.cwd:get(), new_path })
+end
+
+---@async
+---@param dirpath string
+function ContextualFs:mkdir(dirpath)
+ return fs.async.mkdir(path.concat { self.cwd:get(), dirpath })
+end
+
+---@class CwdManager
+---@field private install_prefix string @Defines the upper boundary for which paths are allowed as cwd.
+---@field private cwd string
+local CwdManager = {}
+CwdManager.__index = CwdManager
+
+function CwdManager.new(install_prefix)
+ assert(type(install_prefix) == "string")
+ return setmetatable({
+ install_prefix = install_prefix,
+ cwd = nil,
+ }, CwdManager)
+end
+
+function CwdManager:get()
+ assert(self.cwd ~= nil, "Tried to access cwd before it was set.")
+ return self.cwd
+end
+
+---@param new_cwd string
+function CwdManager:set(new_cwd)
+ assert(type(new_cwd) == "string")
+ assert(
+ path.is_subdirectory(self.install_prefix, new_cwd),
+ ("%q is not a subdirectory of %q"):format(new_cwd, self.install_prefix)
+ )
+ self.cwd = new_cwd
+end
+
+---@class InstallContext
+---@field public receipt InstallReceiptBuilder
+---@field public requested_version Optional
+---@field public fs ContextualFs
+---@field public spawn JobSpawn
+---@field public handle InstallHandle
+---@field public package Package
+---@field public cwd CwdManager
+---@field public stdio_sink StdioSink
+local InstallContext = {}
+InstallContext.__index = InstallContext
+
+---@class InstallContextOpts
+---@field requested_version string|nil
+
+---@param handle InstallHandle
+---@param opts InstallContextOpts
+function InstallContext.new(handle, opts)
+ local cwd_manager = CwdManager.new(path.install_prefix())
+ return setmetatable({
+ cwd = cwd_manager,
+ spawn = ContextualSpawn.new(cwd_manager, handle),
+ handle = handle,
+ package = handle.package, -- for convenience
+ fs = ContextualFs.new(cwd_manager),
+ receipt = receipt.InstallReceiptBuilder.new(),
+ requested_version = Optional.of_nilable(opts.requested_version),
+ stdio_sink = handle.stdio.sink,
+ }, InstallContext)
+end
+
+---@async
+function InstallContext:promote_cwd()
+ local cwd = self.cwd:get()
+ local install_path = self.package:get_install_path()
+ if install_path == cwd then
+ log.fmt_debug("cwd %s is already promoted (at %s)", cwd, install_path)
+ return
+ end
+ log.fmt_debug("Promoting cwd %s to %s", cwd, install_path)
+ -- 1. Unlink any existing installation
+ self.handle.package:unlink()
+ -- 2. Prepare for renaming cwd to destination
+ if platform.is_unix then
+ -- Some Unix systems will raise an error when renaming a directory to a destination that does not already exist.
+ fs.async.mkdir(install_path)
+ end
+ -- 3. Move the cwd to the final installation directory
+ fs.async.rename(cwd, install_path)
+ -- 4. Update cwd
+ self.cwd:set(install_path)
+end
+
+---@param rel_path string @The relative path from the current working directory to change cwd to. Will only restore to the initial cwd after execution of fn (if provided).
+---@param fn async fun() @(optional) The function to run in the context of the given path.
+function InstallContext:chdir(rel_path, fn)
+ local old_cwd = self.cwd:get()
+ self.cwd:set(path.concat { old_cwd, rel_path })
+ if fn then
+ local ok, result = pcall(fn)
+ self.cwd:set(old_cwd)
+ if not ok then
+ error(result, 0)
+ end
+ return result
+ end
+end
+
+---@param new_executable_rel_path string @Relative path to the executable file to create.
+---@param script_rel_path string @Relative path to the Node.js script.
+function InstallContext:write_node_exec_wrapper(new_executable_rel_path, script_rel_path)
+ return self:write_shell_exec_wrapper(
+ new_executable_rel_path,
+ ("node %q"):format(path.concat {
+ self.package:get_install_path(),
+ script_rel_path,
+ })
+ )
+end
+
+---@param new_executable_rel_path string @Relative path to the executable file to create.
+---@param target_executable_rel_path string
+function InstallContext:write_exec_wrapper(new_executable_rel_path, target_executable_rel_path)
+ return self:write_shell_exec_wrapper(
+ new_executable_rel_path,
+ ("%q"):format(path.concat {
+ self.package:get_install_path(),
+ target_executable_rel_path,
+ })
+ )
+end
+
+---@param new_executable_rel_path string @Relative path to the executable file to create.
+---@param command string @The shell command to run.
+---@return string @The created executable filename.
+function InstallContext:write_shell_exec_wrapper(new_executable_rel_path, command)
+ return platform.when {
+ unix = function()
+ local std = require "mason.core.managers.std"
+ self.fs:write_file(
+ new_executable_rel_path,
+ _.dedent(([[
+ #!/bin/bash
+ exec %s "$@"
+ ]]):format(command))
+ )
+ std.chmod("+x", { new_executable_rel_path })
+ return new_executable_rel_path
+ end,
+ win = function()
+ local executable_file = ("%s.cmd"):format(new_executable_rel_path)
+ self.fs:write_file(
+ executable_file,
+ _.dedent(([[
+ @ECHO off
+ %s %%*
+ ]]):format(command))
+ )
+ return executable_file
+ end,
+ }
+end
+
+function InstallContext:link_bin(executable, rel_path)
+ self.receipt:with_link("bin", executable, rel_path)
+end
+
+return InstallContext
diff --git a/lua/mason/core/installer/handle.lua b/lua/mason/core/installer/handle.lua
new file mode 100644
index 00000000..42ea58b6
--- /dev/null
+++ b/lua/mason/core/installer/handle.lua
@@ -0,0 +1,214 @@
+local a = require "mason.core.async"
+local spawn = require "mason.core.spawn"
+local _ = require "mason.core.functional"
+local process = require "mason.core.process"
+local EventEmitter = require "mason.core.EventEmitter"
+local log = require "mason.log"
+local Optional = require "mason.core.optional"
+local platform = require "mason.core.platform"
+
+local uv = vim.loop
+
+---@alias InstallHandleState
+--- | '"IDLE"'
+--- | '"QUEUED"'
+--- | '"ACTIVE"'
+--- | '"CLOSED"'
+
+---@class InstallHandleSpawnInfo
+---@field handle luv_handle
+---@field pid integer
+---@field cmd string
+---@field args string[]
+local InstallHandleSpawnInfo = {}
+InstallHandleSpawnInfo.__index = InstallHandleSpawnInfo
+
+---@param fields InstallHandleSpawnInfo
+function InstallHandleSpawnInfo.new(fields)
+ return setmetatable(fields, InstallHandleSpawnInfo)
+end
+
+function InstallHandleSpawnInfo:__tostring()
+ return ("%s %s"):format(self.cmd, table.concat(self.args, " "))
+end
+
+---@class InstallHandle : EventEmitter
+---@field package Package
+---@field state InstallHandleState
+---@field stdio { buffers: { stdout: string[], stderr: string[] }, sink: StdioSink }
+---@field is_terminated boolean
+---@field private spawninfo_stack InstallHandleSpawnInfo[]
+local InstallHandle = setmetatable({}, { __index = EventEmitter })
+local InstallHandleMt = { __index = InstallHandle }
+
+---@param handle InstallHandle
+local function new_sink(handle)
+ local stdout, stderr = {}, {}
+ return {
+ buffers = { stdout = stdout, stderr = stderr },
+ sink = {
+ stdout = function(chunk)
+ stdout[#stdout + 1] = chunk
+ handle:emit("stdout", chunk)
+ end,
+ stderr = function(chunk)
+ stderr[#stderr + 1] = chunk
+ handle:emit("stderr", chunk)
+ end,
+ },
+ }
+end
+
+---@param package Package
+function InstallHandle.new(package)
+ local self = EventEmitter.init(setmetatable({}, InstallHandleMt))
+ self.state = "IDLE"
+ self.package = package
+ self.spawninfo_stack = {}
+ self.stdio = new_sink(self)
+ self.is_terminated = false
+ return self
+end
+
+---@param luv_handle luv_handle
+---@param pid integer
+---@param cmd string
+---@param args string[]
+function InstallHandle:push_spawninfo(luv_handle, pid, cmd, args)
+ local spawninfo = InstallHandleSpawnInfo.new {
+ handle = luv_handle,
+ pid = pid,
+ cmd = cmd,
+ args = args,
+ }
+ log.fmt_trace("Pushing spawninfo stack for %s: %s (pid: %s)", self, spawninfo, pid)
+ self.spawninfo_stack[#self.spawninfo_stack + 1] = spawninfo
+ self:emit "spawninfo:change"
+end
+
+---@param luv_handle luv_handle
+function InstallHandle:pop_spawninfo(luv_handle)
+ for i = #self.spawninfo_stack, 1, -1 do
+ if self.spawninfo_stack[i].handle == luv_handle then
+ log.fmt_trace("Popping spawninfo stack for %s: %s", self, self.spawninfo_stack[i])
+ table.remove(self.spawninfo_stack, i)
+ self:emit "spawninfo:change"
+ return true
+ end
+ end
+ return false
+end
+
+---@return Optional @Optional<InstallHandleSpawnInfo>
+function InstallHandle:peek_spawninfo_stack()
+ return Optional.of_nilable(self.spawninfo_stack[#self.spawninfo_stack])
+end
+
+function InstallHandle:is_idle()
+ return self.state == "IDLE"
+end
+
+function InstallHandle:is_queued()
+ return self.state == "QUEUED"
+end
+
+function InstallHandle:is_active()
+ return self.state == "ACTIVE"
+end
+
+function InstallHandle:is_closed()
+ return self.state == "CLOSED"
+end
+
+---@param new_state InstallHandleState
+function InstallHandle:set_state(new_state)
+ local old_state = self.state
+ self.state = new_state
+ log.fmt_trace("Changing %s state from %s to %s", self, old_state, new_state)
+ self:emit("state:change", new_state, old_state)
+end
+
+---@param signal integer
+function InstallHandle:kill(signal)
+ assert(not self:is_closed(), "Cannot kill closed handle.")
+ log.fmt_trace("Sending signal %s to luv handles in %s", signal, self)
+ for _, spawninfo in pairs(self.spawninfo_stack) do
+ process.kill(spawninfo.handle, signal)
+ end
+ self:emit("kill", signal)
+end
+
+---@param pid integer
+local win_taskkill = a.scope(function (pid)
+ spawn.taskkill {
+ "/f",
+ "/t",
+ "/pid",
+ pid
+ }
+end)
+
+function InstallHandle:terminate()
+ assert(not self:is_closed(), "Cannot terminate closed handle.")
+ if self.is_terminated then
+ log.fmt_trace("Handle is already terminated %s", self)
+ return
+ end
+ log.fmt_trace("Terminating %s", self)
+ -- https://github.com/libuv/libuv/issues/1133
+ if platform.is.win then
+ for _, spawninfo in ipairs(self.spawninfo_stack) do
+ win_taskkill(spawninfo.pid)
+ end
+ else
+ self:kill(15) -- SIGTERM
+ end
+ self.is_terminated = true
+ self:emit "terminate"
+ local check = uv.new_check()
+ check:start(function()
+ for _, spawninfo in ipairs(self.spawninfo_stack) do
+ local luv_handle = spawninfo.handle
+ local ok, is_closing = pcall(luv_handle.is_closing, luv_handle)
+ if ok and not is_closing then
+ return
+ end
+ end
+ check:stop()
+ if not self:is_closed() then
+ self:close()
+ end
+ end)
+end
+
+function InstallHandle:queued()
+ assert(self:is_idle(), "Can only queue idle handles.")
+ self:set_state "QUEUED"
+end
+
+function InstallHandle:active()
+ assert(self:is_idle() or self:is_queued(), "Can only activate idle or queued handles.")
+ self:set_state "ACTIVE"
+end
+
+function InstallHandle:close()
+ log.fmt_trace("Closing %s", self)
+ assert(not self:is_closed(), "Handle is already closed.")
+ for _, spawninfo in ipairs(self.spawninfo_stack) do
+ local luv_handle = spawninfo.handle
+ local ok, is_closing = pcall(luv_handle.is_closing, luv_handle)
+ if ok then
+ assert(is_closing, "There are open libuv handles.")
+ end
+ end
+ self.spawninfo_stack = {}
+ self:set_state "CLOSED"
+ self:emit "closed"
+ self:clear_event_handlers()
+end
+
+function InstallHandleMt:__tostring()
+ return ("InstallHandle(package=%s, state=%s)"):format(self.package, self.state)
+end
+
+return InstallHandle
diff --git a/lua/mason/core/installer/init.lua b/lua/mason/core/installer/init.lua
new file mode 100644
index 00000000..5203f381
--- /dev/null
+++ b/lua/mason/core/installer/init.lua
@@ -0,0 +1,176 @@
+local log = require "mason.log"
+local _ = require "mason.core.functional"
+local path = require "mason.core.path"
+local fs = require "mason.core.fs"
+local a = require "mason.core.async"
+local Result = require "mason.core.result"
+local InstallContext = require "mason.core.installer.context"
+local settings = require "mason.settings"
+local linker = require "mason.core.installer.linker"
+local control = require "mason.core.async.control"
+
+local Semaphore = control.Semaphore
+
+local sem = Semaphore.new(settings.current.max_concurrent_installers)
+
+local M = {}
+
+---@async
+local function create_prefix_dirs()
+ for _, p in ipairs { path.install_prefix(), path.bin_prefix(), path.package_prefix(), path.package_build_prefix() } do
+ if not fs.async.dir_exists(p) then
+ fs.async.mkdirp(p)
+ end
+ end
+end
+
+---@async
+---@param context InstallContext
+local function write_receipt(context)
+ log.fmt_debug("Writing receipt for %s", package)
+ context.receipt
+ :with_name(context.package.name)
+ :with_schema_version("1.0")
+ :with_completion_time(vim.loop.gettimeofday())
+ local receipt_path = path.concat { context.cwd:get(), "mason-receipt.json" }
+ local install_receipt = context.receipt:build()
+ fs.async.write_file(receipt_path, vim.json.encode(install_receipt))
+end
+
+local CONTEXT_REQUEST = {}
+
+---@return InstallContext
+function M.context()
+ return coroutine.yield(CONTEXT_REQUEST)
+end
+
+---@async
+---@param context InstallContext
+function M.prepare_installer(context)
+ create_prefix_dirs()
+ local package_build_prefix = path.package_build_prefix(context.package.name)
+ if fs.async.dir_exists(package_build_prefix) then
+ fs.async.rmrf(package_build_prefix)
+ end
+ fs.async.mkdirp(package_build_prefix)
+ context.cwd:set(package_build_prefix)
+end
+
+---@async
+---@param context InstallContext
+---@param installer async fun(context: InstallContext)
+function M.run_installer(context, installer)
+ local thread = coroutine.create(function(...)
+ -- We wrap the installer with a function to allow it to be a spy instance (in which case it's not a function, but a metatable - coroutine.create expects functions only)
+ return installer(...)
+ end)
+ local step
+ local ret_val
+ step = function(...)
+ local ok, result = coroutine.resume(thread, ...)
+ if not ok then
+ error(result, 0)
+ elseif result == CONTEXT_REQUEST then
+ step(context)
+ elseif coroutine.status(thread) == "suspended" then
+ -- yield to parent coroutine
+ step(coroutine.yield(result))
+ else
+ ret_val = result
+ end
+ end
+ context.receipt:with_start_time(vim.loop.gettimeofday())
+ M.prepare_installer(context)
+ step(context)
+ return ret_val
+end
+
+---@async
+---@param handle InstallHandle
+---@param opts InstallContextOpts
+function M.execute(handle, opts)
+ if handle:is_active() or handle:is_closed() then
+ log.fmt_debug("Received active or closed handle %s", handle)
+ return Result.failure "Invalid handle state."
+ end
+
+ handle:queued()
+ local permit = sem:acquire()
+ if handle:is_closed() then
+ permit:forget()
+ log.fmt_trace("Installation was aborted %s", handle)
+ return Result.failure "Installation was aborted."
+ end
+ log.fmt_trace("Activating handle %s", handle)
+ handle:active()
+
+ local package = handle.package
+ local context = InstallContext.new(handle, opts)
+
+ log.fmt_info("Executing installer for %s", package)
+ return Result.run_catching(function()
+ -- 1. run installer
+ a.wait(function(resolve, reject)
+ local cancel_thread = a.run(M.run_installer, function(success, result)
+ if success then
+ resolve(result)
+ else
+ reject(result)
+ end
+ end, context, package.spec.install)
+
+ handle:once("terminate", function()
+ handle:once("closed", function()
+ reject "Installation was aborted."
+ end)
+ cancel_thread()
+ end)
+ end)
+
+ -- 2. promote temporary installation dir
+ context:promote_cwd()
+
+ -- 3. link package
+ linker.link(context)
+
+ -- 4. write receipt
+ write_receipt(context)
+ end)
+ :on_success(function()
+ permit:forget()
+ handle:close()
+ log.fmt_info("Installation succeeded for %s", package)
+ end)
+ :on_failure(function(failure)
+ permit:forget()
+ log.fmt_error("Installation failed for %s error=%s", package, failure)
+ context.stdio_sink.stderr(tostring(failure))
+ context.stdio_sink.stderr "\n"
+
+ -- clean up installation dir
+ pcall(function()
+ fs.async.rmrf(context.cwd:get())
+ end)
+
+ -- unlink linked executables (in the rare occassion an error occurs after linking)
+ linker.unlink(context.package, context.receipt.links)
+
+ if not handle:is_closed() and not handle.is_terminated then
+ handle:close()
+ end
+ end)
+end
+
+---Runs the provided async functions concurrently and returns their result, once all are resolved.
+---This is really just a wrapper around a.wait_all() that makes sure to patch the coroutine context before creating the
+---new async execution contexts.
+---@async
+---@param suspend_fns async fun(ctx: InstallContext)[]
+function M.run_concurrently(suspend_fns)
+ local context = M.context()
+ return a.wait_all(_.map(function(suspend_fn)
+ return _.partial(M.run_installer, context, suspend_fn)
+ end, suspend_fns))
+end
+
+return M
diff --git a/lua/mason/core/installer/linker.lua b/lua/mason/core/installer/linker.lua
new file mode 100644
index 00000000..be5e8d82
--- /dev/null
+++ b/lua/mason/core/installer/linker.lua
@@ -0,0 +1,84 @@
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local log = require "mason.log"
+local fs = require "mason.core.fs"
+
+local M = {}
+
+---@param package Package
+---@param links InstallReceiptLinks
+local function unlink_bin(package, links)
+ for executable in pairs(links.bin) do
+ local bin_path = path.bin_prefix(executable)
+ fs.sync.unlink(bin_path)
+ end
+end
+
+---@param package Package
+---@param links InstallReceiptLinks
+function M.unlink(package, links)
+ log.fmt_debug("Unlinking %s", package)
+ unlink_bin(package, links)
+end
+
+---@param to string
+local function relative_path_from_bin(to)
+ local _, match_end = to:find(path.install_prefix(), 1, true)
+ assert(match_end, "Failed to produce relative path.")
+ local relative_path = to:sub(match_end + 1)
+ return ".." .. relative_path
+end
+
+---@async
+---@param context InstallContext
+local function link_bin(context)
+ local links = context.receipt.links.bin
+ local pkg = context.package
+ for name, rel_path in pairs(links) do
+ local target_abs_path = path.concat { pkg:get_install_path(), rel_path }
+ local target_rel_path = relative_path_from_bin(target_abs_path)
+ local bin_path = path.bin_prefix(name)
+
+ assert(not fs.async.file_exists(bin_path), ("bin/%s is already linked."):format(name))
+ assert(fs.async.file_exists(target_abs_path), ("Link target %q does not exist."):format(target_abs_path))
+
+ log.fmt_debug("Linking bin %s to %s", name, target_rel_path)
+
+ platform.when {
+ unix = function()
+ fs.async.symlink(target_rel_path, bin_path)
+ end,
+ win = function()
+ -- We don't "symlink" on Windows because:
+ -- 1) .LNK is not commonly found in PATHEXT
+ -- 2) some executables can only run from their true installation location
+ -- 3) many utilities only consider .COM, .EXE, .CMD, .BAT files as candidates by default when resolving executables (e.g. neovim's |exepath()| and |executable()|)
+ fs.async.write_file(
+ ("%s.cmd"):format(bin_path),
+ _.dedent(([[
+ @ECHO off
+ GOTO start
+ :find_dp0
+ SET dp0=%%~dp0
+ EXIT /b
+ :start
+ SETLOCAL
+ CALL :find_dp0
+
+ endLocal & goto #_undefined_# 2>NUL || title %%COMSPEC%% & "%%dp0%%\%s" %%*
+ ]]):format(target_rel_path))
+ )
+ end,
+ }
+ end
+end
+
+---@async
+---@param context InstallContext
+function M.link(context)
+ log.fmt_debug("Linking %s", context.package)
+ link_bin(context)
+end
+
+return M
diff --git a/lua/nvim-lsp-installer/core/managers/cargo/client.lua b/lua/mason/core/managers/cargo/client.lua
index d4f0e2a7..6e5f2064 100644
--- a/lua/nvim-lsp-installer/core/managers/cargo/client.lua
+++ b/lua/mason/core/managers/cargo/client.lua
@@ -1,4 +1,4 @@
-local fetch = require "nvim-lsp-installer.core.fetch"
+local fetch = require "mason.core.fetch"
local M = {}
diff --git a/lua/nvim-lsp-installer/core/managers/cargo/init.lua b/lua/mason/core/managers/cargo/init.lua
index 77ec5ae8..f845e7d8 100644
--- a/lua/nvim-lsp-installer/core/managers/cargo/init.lua
+++ b/lua/mason/core/managers/cargo/init.lua
@@ -1,10 +1,16 @@
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
-local spawn = require "nvim-lsp-installer.core.spawn"
-local a = require "nvim-lsp-installer.core.async"
-local Optional = require "nvim-lsp-installer.core.optional"
-local installer = require "nvim-lsp-installer.core.installer"
-local client = require "nvim-lsp-installer.core.managers.cargo.client"
+local process = require "mason.core.process"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local spawn = require "mason.core.spawn"
+local a = require "mason.core.async"
+local Optional = require "mason.core.optional"
+local installer = require "mason.core.installer"
+local client = require "mason.core.managers.cargo.client"
+local _ = require "mason.core.functional"
+
+local get_bin_path = _.compose(path.concat, function(executable)
+ return _.append(executable, { "bin" })
+end, _.if_else(_.always(platform.is.win), _.format "%s.exe", _.identity))
---@param crate string
local function with_receipt(crate)
@@ -18,16 +24,16 @@ local M = {}
---@async
---@param crate string The crate to install.
----@param opts {git:boolean, features:string|nil}
+---@param opts {git: boolean | string, features: string|nil, bin: string[] | nil } | nil
function M.crate(crate, opts)
return function()
- return M.install(crate, opts).with_receipt()
+ M.install(crate, opts).with_receipt()
end
end
---@async
---@param crate string The crate to install.
----@param opts {git:boolean, features:string|nil}
+---@param opts {git: boolean | string, features: string|nil, bin: string[] | nil } | nil
function M.install(crate, opts)
local ctx = installer.context()
opts = opts or {}
@@ -59,6 +65,12 @@ function M.install(crate, opts)
final_crate,
}
+ if opts.bin then
+ _.each(function(bin)
+ ctx:link_bin(bin, get_bin_path(bin))
+ end, opts.bin)
+ end
+
return {
with_receipt = with_receipt(crate),
}
diff --git a/lua/nvim-lsp-installer/core/managers/composer/init.lua b/lua/mason/core/managers/composer/init.lua
index e2330c40..a0656ba7 100644
--- a/lua/nvim-lsp-installer/core/managers/composer/init.lua
+++ b/lua/mason/core/managers/composer/init.lua
@@ -1,13 +1,18 @@
-local _ = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
-local Result = require "nvim-lsp-installer.core.result"
-local spawn = require "nvim-lsp-installer.core.spawn"
-local Optional = require "nvim-lsp-installer.core.optional"
-local installer = require "nvim-lsp-installer.core.installer"
+local _ = require "mason.core.functional"
+local process = require "mason.core.process"
+local path = require "mason.core.path"
+local Result = require "mason.core.result"
+local spawn = require "mason.core.spawn"
+local Optional = require "mason.core.optional"
+local installer = require "mason.core.installer"
+local platform = require "mason.core.platform"
local M = {}
+local create_bin_path = _.compose(path.concat, function(executable)
+ return _.append(executable, { "vendor", "bin" })
+end, _.if_else(_.always(platform.is.win), _.format "%s.bat", _.identity))
+
---@param packages string[]
local function with_receipt(packages)
return function()
@@ -21,7 +26,7 @@ local function with_receipt(packages)
end
---@async
----@param packages string[] The composer packages to install. The first item in this list will be the recipient of the server version, should the user request a specific one.
+---@param packages { [number]: string, bin: string[] | nil } @The composer packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.packages(packages)
return function()
return M.require(packages).with_receipt()
@@ -29,7 +34,7 @@ function M.packages(packages)
end
---@async
----@param packages string[] The composer packages to install. The first item in this list will be the recipient of the server version, should the user request a specific one.
+---@param packages { [number]: string, bin: string[] | nil } @The composer packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.require(packages)
local ctx = installer.context()
local pkgs = _.list_copy(packages)
@@ -44,6 +49,12 @@ function M.require(packages)
ctx.spawn.composer { "require", pkgs }
+ if packages.bin then
+ _.each(function(executable)
+ ctx:link_bin(executable, create_bin_path(executable))
+ end, packages.bin)
+ end
+
return {
with_receipt = with_receipt(packages),
}
diff --git a/lua/nvim-lsp-installer/core/managers/dotnet/init.lua b/lua/mason/core/managers/dotnet/init.lua
index 3c16a4ad..658143bf 100644
--- a/lua/nvim-lsp-installer/core/managers/dotnet/init.lua
+++ b/lua/mason/core/managers/dotnet/init.lua
@@ -1,8 +1,13 @@
-local process = require "nvim-lsp-installer.core.process"
-local installer = require "nvim-lsp-installer.core.installer"
+local process = require "mason.core.process"
+local installer = require "mason.core.installer"
+local _ = require "mason.core.functional"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
local M = {}
+local create_bin_path = _.if_else(_.always(platform.is.win), _.format "%s.exe", _.identity)
+
---@param package string
local function with_receipt(package)
return function()
@@ -13,15 +18,17 @@ end
---@async
---@param package string
-function M.package(package)
+---@param opt { bin: string[] | nil } | nil
+function M.package(package, opt)
return function()
- return M.install(package).with_receipt()
+ return M.install(package, opt).with_receipt()
end
end
---@async
---@param package string
-function M.install(package)
+---@param opt { bin: string[] | nil } | nil
+function M.install(package, opt)
local ctx = installer.context()
ctx.spawn.dotnet {
"tool",
@@ -36,6 +43,14 @@ function M.install(package)
package,
}
+ if opt and opt.bin then
+ if opt.bin then
+ _.each(function(executable)
+ ctx:link_bin(executable, create_bin_path(executable))
+ end, opt.bin)
+ end
+ end
+
return {
with_receipt = with_receipt(package),
}
diff --git a/lua/nvim-lsp-installer/core/managers/gem/init.lua b/lua/mason/core/managers/gem/init.lua
index e70c89c7..0aa900b5 100644
--- a/lua/nvim-lsp-installer/core/managers/gem/init.lua
+++ b/lua/mason/core/managers/gem/init.lua
@@ -1,13 +1,18 @@
-local _ = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
-local Result = require "nvim-lsp-installer.core.result"
-local spawn = require "nvim-lsp-installer.core.spawn"
-local Optional = require "nvim-lsp-installer.core.optional"
-local installer = require "nvim-lsp-installer.core.installer"
+local _ = require "mason.core.functional"
+local process = require "mason.core.process"
+local path = require "mason.core.path"
+local Result = require "mason.core.result"
+local spawn = require "mason.core.spawn"
+local Optional = require "mason.core.optional"
+local installer = require "mason.core.installer"
+local platform = require "mason.core.platform"
local M = {}
+local create_bin_path = _.compose(path.concat, function(executable)
+ return _.append(executable, { "bin" })
+end, _.if_else(_.always(platform.is.win), _.format "%s.cmd", _.identity))
+
---@param packages string[]
local function with_receipt(packages)
return function()
@@ -20,7 +25,7 @@ local function with_receipt(packages)
end
---@async
----@param packages string[] @The Gem packages to install. The first item in this list will be the recipient of the server version, should the user request a specific one.
+---@param packages { [number]: string, bin: string[] | nil } @The Gem packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.packages(packages)
return function()
return M.install(packages).with_receipt()
@@ -28,7 +33,7 @@ function M.packages(packages)
end
---@async
----@param packages string[] @The Gem packages to install. The first item in this list will be the recipient of the server version, should the user request a specific one.
+---@param packages { [number]: string, bin: string[] | nil } @The Gem packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.install(packages)
local ctx = installer.context()
local pkgs = _.list_copy(packages or {})
@@ -46,6 +51,12 @@ function M.install(packages)
pkgs,
}
+ if packages.bin then
+ _.each(function(executable)
+ ctx:link_bin(executable, create_bin_path(executable))
+ end, packages.bin)
+ end
+
return {
with_receipt = with_receipt(packages),
}
diff --git a/lua/nvim-lsp-installer/core/managers/git/init.lua b/lua/mason/core/managers/git/init.lua
index 559703c9..517557e0 100644
--- a/lua/nvim-lsp-installer/core/managers/git/init.lua
+++ b/lua/mason/core/managers/git/init.lua
@@ -1,7 +1,7 @@
-local spawn = require "nvim-lsp-installer.core.spawn"
-local Result = require "nvim-lsp-installer.core.result"
-local installer = require "nvim-lsp-installer.core.installer"
-local _ = require "nvim-lsp-installer.core.functional"
+local spawn = require "mason.core.spawn"
+local Result = require "mason.core.result"
+local installer = require "mason.core.installer"
+local _ = require "mason.core.functional"
local M = {}
@@ -58,8 +58,9 @@ function M.check_outdated_git_clone(receipt, install_dir)
end
---@async
+---@param receipt InstallReceipt
---@param install_dir string
-function M.get_installed_revision(install_dir)
+function M.get_installed_revision(receipt, install_dir)
return spawn.git({
"rev-parse",
"--short",
diff --git a/lua/nvim-lsp-installer/core/managers/github/client.lua b/lua/mason/core/managers/github/client.lua
index 530fee06..99398c59 100644
--- a/lua/nvim-lsp-installer/core/managers/github/client.lua
+++ b/lua/mason/core/managers/github/client.lua
@@ -1,7 +1,7 @@
-local _ = require "nvim-lsp-installer.core.functional"
-local log = require "nvim-lsp-installer.log"
-local fetch = require "nvim-lsp-installer.core.fetch"
-local spawn = require "nvim-lsp-installer.core.spawn"
+local _ = require "mason.core.functional"
+local log = require "mason.log"
+local fetch = require "mason.core.fetch"
+local spawn = require "mason.core.spawn"
local M = {}
@@ -13,9 +13,7 @@ local M = {}
---@return Result @JSON decoded response.
local function api_call(path)
return spawn.gh({ "api", path })
- :map(function(result)
- return result.stdout
- end)
+ :map(_.prop "stdout")
:recover_catching(function()
return fetch(("https://api.github.com/%s"):format(path)):get_or_throw()
end)
@@ -98,14 +96,12 @@ end
---@async
---@param repo string @The GitHub repo ("username/repo").
----@return Result @of GitHubTag
+---@return Result @Result<string> - The latest tag name.
function M.fetch_latest_tag(repo)
- return M.fetch_tags(repo):map_catching(function(tags)
- if vim.tbl_count(tags) == 0 then
- error "No tags found."
- end
- return tags[1]
- end)
+ -- https://github.com/williamboman/vercel-github-api-latest-tag-proxy
+ return fetch(("https://latest-github-tag.redwill.se/api/latest-tag?repo=%s"):format(repo))
+ :map_catching(vim.json.decode)
+ :map(_.prop "tag")
end
---@alias GitHubRateLimit {limit: integer, remaining: integer, reset: integer, used: integer}
diff --git a/lua/nvim-lsp-installer/core/managers/github/init.lua b/lua/mason/core/managers/github/init.lua
index f74fde76..aa44073f 100644
--- a/lua/nvim-lsp-installer/core/managers/github/init.lua
+++ b/lua/mason/core/managers/github/init.lua
@@ -1,10 +1,10 @@
-local installer = require "nvim-lsp-installer.core.installer"
-local std = require "nvim-lsp-installer.core.managers.std"
-local client = require "nvim-lsp-installer.core.managers.github.client"
-local platform = require "nvim-lsp-installer.core.platform"
-local Result = require "nvim-lsp-installer.core.result"
-local _ = require "nvim-lsp-installer.core.functional"
-local settings = require "nvim-lsp-installer.settings"
+local installer = require "mason.core.installer"
+local std = require "mason.core.managers.std"
+local client = require "mason.core.managers.github.client"
+local platform = require "mason.core.platform"
+local Result = require "mason.core.result"
+local _ = require "mason.core.functional"
+local settings = require "mason.settings"
local M = {}
@@ -43,7 +43,7 @@ function M.release_file(opts)
local release = _.coalesce(opts.version, ctx.requested_version):or_else_get(function()
return client.fetch_latest_release(opts.repo)
:map(_.prop "tag_name")
- :get_or_throw "Failed to fetch latest release from GitHub API. Refer to :h nvim-lsp-installer-errors-github-api for more information."
+ :get_or_throw "Failed to fetch latest release from GitHub API. Refer to :h mason-errors-github-api for more information."
end)
---@type string
local asset_file
@@ -74,9 +74,7 @@ end
function M.tag(opts)
local ctx = installer.context()
local tag = _.coalesce(opts.version, ctx.requested_version):or_else_get(function()
- return client.fetch_latest_tag(opts.repo)
- :map(_.prop "name")
- :get_or_throw "Failed to fetch latest tag from GitHub API."
+ return client.fetch_latest_tag(opts.repo):get_or_throw "Failed to fetch latest tag from GitHub API."
end)
return {
@@ -86,14 +84,14 @@ function M.tag(opts)
end
---@param filename string
----@param processor async fun()
+---@param processor async fun(opts: table)
local function release_file_processor(filename, processor)
---@async
---@param opts {repo: string, asset_file: string|fun(release: string):string}
return function(opts)
local release_file_source = M.release_file(opts)
std.download_file(release_file_source.download_url, filename)
- processor(release_file_source)
+ processor(opts)
return release_file_source
end
end
@@ -102,12 +100,12 @@ M.unzip_release_file = release_file_processor("archive.zip", function()
std.unzip("archive.zip", ".")
end)
-M.untarxz_release_file = release_file_processor("archive.tar.xz", function()
- std.untarxz "archive.tar.xz"
+M.untarxz_release_file = release_file_processor("archive.tar.xz", function(opts)
+ std.untarxz("archive.tar.xz", { strip_components = opts.strip_components })
end)
-M.untargz_release_file = release_file_processor("archive.tar.gz", function()
- std.untar "archive.tar.gz"
+M.untargz_release_file = release_file_processor("archive.tar.gz", function(opts)
+ std.untar("archive.tar.gz", { strip_components = opts.strip_components })
end)
---@async
@@ -157,19 +155,16 @@ function M.check_outdated_primary_package_tag(receipt)
if source.type ~= "github_tag" then
return Result.failure "Receipt does not have a primary source of type github_tag."
end
- return client.fetch_latest_tag(source.repo):map_catching(
- ---@param latest_tag GitHubTag
- function(latest_tag)
- if source.tag ~= latest_tag.name then
- return {
- name = source.repo,
- current_version = source.tag,
- latest_version = latest_tag.name,
- }
- end
- error "Primary package is not outdated."
+ return client.fetch_latest_tag(source.repo):map_catching(function(latest_tag)
+ if source.tag ~= latest_tag then
+ return {
+ name = source.repo,
+ current_version = source.tag,
+ latest_version = latest_tag,
+ }
end
- )
+ error "Primary package is not outdated."
+ end)
end
return M
diff --git a/lua/nvim-lsp-installer/core/managers/go/init.lua b/lua/mason/core/managers/go/init.lua
index 067cff58..d83f2e16 100644
--- a/lua/nvim-lsp-installer/core/managers/go/init.lua
+++ b/lua/mason/core/managers/go/init.lua
@@ -1,12 +1,15 @@
-local installer = require "nvim-lsp-installer.core.installer"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local spawn = require "nvim-lsp-installer.core.spawn"
-local a = require "nvim-lsp-installer.core.async"
-local Optional = require "nvim-lsp-installer.core.optional"
+local installer = require "mason.core.installer"
+local process = require "mason.core.process"
+local platform = require "mason.core.platform"
+local spawn = require "mason.core.spawn"
+local a = require "mason.core.async"
+local Optional = require "mason.core.optional"
+local _ = require "mason.core.functional"
local M = {}
+local create_bin_path = _.if_else(_.always(platform.is.win), _.format "%s.exe", _.identity)
+
---@param packages string[]
local function with_receipt(packages)
return function()
@@ -21,7 +24,7 @@ local function with_receipt(packages)
end
---@async
----@param packages string[] The Go packages to install. The first item in this list will be the recipient of the server version, should the user request a specific one.
+---@param packages { [number]: string, bin: string[] | nil } @The go packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.packages(packages)
return function()
M.install(packages).with_receipt()
@@ -29,7 +32,7 @@ function M.packages(packages)
end
---@async
----@param packages string[] The Go packages to install. The first item in this list will be the recipient of the server version, should the user request a specific one.
+---@param packages { [number]: string, bin: string[] | nil } @The go packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.install(packages)
local ctx = installer.context()
local env = {
@@ -52,6 +55,12 @@ function M.install(packages)
ctx.spawn.go { "install", "-v", ("%s@latest"):format(packages[i]), env = env }
end
+ if packages.bin then
+ _.each(function(executable)
+ ctx:link_bin(executable, create_bin_path(executable))
+ end, packages.bin)
+ end
+
return {
with_receipt = with_receipt(packages),
}
diff --git a/lua/nvim-lsp-installer/core/managers/luarocks/init.lua b/lua/mason/core/managers/luarocks/init.lua
index e25c92a2..dee31cfd 100644
--- a/lua/nvim-lsp-installer/core/managers/luarocks/init.lua
+++ b/lua/mason/core/managers/luarocks/init.lua
@@ -1,10 +1,11 @@
-local installer = require "nvim-lsp-installer.core.installer"
-local _ = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
-local Result = require "nvim-lsp-installer.core.result"
-local spawn = require "nvim-lsp-installer.core.spawn"
-local Optional = require "nvim-lsp-installer.core.optional"
+local installer = require "mason.core.installer"
+local _ = require "mason.core.functional"
+local process = require "mason.core.process"
+local path = require "mason.core.path"
+local Result = require "mason.core.result"
+local spawn = require "mason.core.spawn"
+local Optional = require "mason.core.optional"
+local platform = require "mason.core.platform"
local M = {}
@@ -127,4 +128,8 @@ function M.env(install_dir)
}
end
+local create_bin_path = _.compose(path.concat, function(executable)
+ return _.append(executable, { "bin" })
+end, _.if_else(_.always(platform.is.win), _.format "%s.bat", _.identity))
+
return M
diff --git a/lua/nvim-lsp-installer/core/managers/npm/init.lua b/lua/mason/core/managers/npm/init.lua
index ba3d670e..d338a84e 100644
--- a/lua/nvim-lsp-installer/core/managers/npm/init.lua
+++ b/lua/mason/core/managers/npm/init.lua
@@ -1,21 +1,26 @@
-local functional = require "nvim-lsp-installer.core.functional"
-local spawn = require "nvim-lsp-installer.core.spawn"
-local Optional = require "nvim-lsp-installer.core.optional"
-local installer = require "nvim-lsp-installer.core.installer"
-local Result = require "nvim-lsp-installer.core.result"
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
+local spawn = require "mason.core.spawn"
+local Optional = require "mason.core.optional"
+local installer = require "mason.core.installer"
+local Result = require "mason.core.result"
+local process = require "mason.core.process"
+local path = require "mason.core.path"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
-local list_copy = functional.list_copy
+local list_copy = _.list_copy
local M = {}
+local create_bin_path = _.compose(path.concat, function(executable)
+ return _.append(executable, { "node_modules", ".bin" })
+end, _.if_else(_.always(platform.is.win), _.format "%s.cmd", _.identity))
+
---@async
---@param ctx InstallContext
local function ensure_npm_root(ctx)
if not (ctx.fs:dir_exists "node_modules" or ctx.fs:file_exists "package.json") then
-- Create a package.json to set a boundary for where npm installs packages.
- ctx.spawn.npm { "init", "--yes", "--scope=lsp-installer" }
+ ctx.spawn.npm { "init", "--yes", "--scope=mason" }
end
end
@@ -31,7 +36,7 @@ local function with_receipt(packages)
end
---@async
----@param packages string[] @The npm packages to install. The first item in this list will be the recipient of the requested version, if set.
+---@param packages { [number]: string, bin: string[] | nil } @The npm packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.packages(packages)
return function()
return M.install(packages).with_receipt()
@@ -39,7 +44,7 @@ function M.packages(packages)
end
---@async
----@param packages string[] @The npm packages to install. The first item in this list will be the recipient of the requested version, if set.
+---@param packages { [number]: string, bin: string[] | nil } @The npm packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.install(packages)
local ctx = installer.context()
local pkgs = list_copy(packages)
@@ -60,6 +65,12 @@ function M.install(packages)
ensure_npm_root(ctx)
ctx.spawn.npm { "install", pkgs }
+ if packages.bin then
+ _.each(function(executable)
+ ctx:link_bin(executable, create_bin_path(executable))
+ end, packages.bin)
+ end
+
return {
with_receipt = with_receipt(packages),
}
diff --git a/lua/nvim-lsp-installer/core/managers/opam/init.lua b/lua/mason/core/managers/opam/init.lua
index a4e1163e..3ea8482f 100644
--- a/lua/nvim-lsp-installer/core/managers/opam/init.lua
+++ b/lua/mason/core/managers/opam/init.lua
@@ -1,11 +1,16 @@
-local functional = require "nvim-lsp-installer.core.functional"
-local path = require "nvim-lsp-installer.core.path"
-local process = require "nvim-lsp-installer.core.process"
-local installer = require "nvim-lsp-installer.core.installer"
+local path = require "mason.core.path"
+local process = require "mason.core.process"
+local installer = require "mason.core.installer"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
local M = {}
-local list_copy = functional.list_copy
+local list_copy = _.list_copy
+
+local create_bin_path = _.compose(path.concat, function(executable)
+ return _.append(executable, { "bin" })
+end, _.if_else(_.always(platform.is.win), _.format "%s.exe", _.identity))
---@param packages string[]
local function with_receipt(packages)
@@ -19,7 +24,7 @@ local function with_receipt(packages)
end
---@async
----@param packages string[] @The opam packages to install. The first item in this list will be the recipient of the requested version, if set.
+---@param packages { [number]: string, bin: string[] | nil } @The opam packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.packages(packages)
return function()
return M.install(packages).with_receipt()
@@ -27,7 +32,7 @@ function M.packages(packages)
end
---@async
----@param packages string[] @The opam packages to install. The first item in this list will be the recipient of the requested version, if set.
+---@param packages { [number]: string, bin: string[] | nil } @The opam packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.install(packages)
local ctx = installer.context()
local pkgs = list_copy(packages)
@@ -44,6 +49,12 @@ function M.install(packages)
pkgs,
}
+ if packages.bin then
+ _.each(function(executable)
+ ctx:link_bin(executable, create_bin_path(executable))
+ end, packages.bin)
+ end
+
return {
with_receipt = with_receipt(packages),
}
diff --git a/lua/nvim-lsp-installer/core/managers/pip3/init.lua b/lua/mason/core/managers/pip3/init.lua
index 3b617745..629c6838 100644
--- a/lua/nvim-lsp-installer/core/managers/pip3/init.lua
+++ b/lua/mason/core/managers/pip3/init.lua
@@ -1,17 +1,21 @@
-local _ = require "nvim-lsp-installer.core.functional"
-local settings = require "nvim-lsp-installer.settings"
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local Optional = require "nvim-lsp-installer.core.optional"
-local installer = require "nvim-lsp-installer.core.installer"
-local Result = require "nvim-lsp-installer.core.result"
-local spawn = require "nvim-lsp-installer.core.spawn"
+local _ = require "mason.core.functional"
+local settings = require "mason.settings"
+local process = require "mason.core.process"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local Optional = require "mason.core.optional"
+local installer = require "mason.core.installer"
+local Result = require "mason.core.result"
+local spawn = require "mason.core.spawn"
local VENV_DIR = "venv"
local M = {}
+local create_bin_path = _.compose(path.concat, function(executable)
+ return _.append(executable, { VENV_DIR, platform.is_win and "Scripts" or "bin" })
+end, _.if_else(_.always(platform.is.win), _.format "%s.exe", _.identity))
+
---@param packages string[]
local function with_receipt(packages)
return function()
@@ -24,7 +28,7 @@ local function with_receipt(packages)
end
---@async
----@param packages string[] @The pip packages to install. The first item in this list will be the recipient of the requested version, if set.
+---@param packages { [number]: string, bin: string[] | nil } @The pip packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.packages(packages)
return function()
return M.install(packages).with_receipt()
@@ -32,7 +36,7 @@ function M.packages(packages)
end
---@async
----@param packages string[] @The pip packages to install. The first item in this list will be the recipient of the requested version, if set.
+---@param packages { [number]: string, bin: string[] | nil } @The pip packages to install. The first item in this list will be the recipient of the requested version, if set.
function M.install(packages)
local ctx = installer.context()
local pkgs = _.list_copy(packages)
@@ -57,6 +61,7 @@ function M.install(packages)
ctx.spawn.python {
"-m",
"pip",
+ "--disable-pip-version-check",
"install",
"-U",
settings.current.pip.install_args,
@@ -66,6 +71,12 @@ function M.install(packages)
end)
:or_else_throw "Unable to create python3 venv environment."
+ if packages.bin then
+ _.each(function(bin)
+ ctx:link_bin(bin, create_bin_path(bin))
+ end, packages.bin)
+ end
+
return {
with_receipt = with_receipt(packages),
}
diff --git a/lua/nvim-lsp-installer/core/managers/powershell/init.lua b/lua/mason/core/managers/powershell/init.lua
index 8e94820a..b3b8a160 100644
--- a/lua/nvim-lsp-installer/core/managers/powershell/init.lua
+++ b/lua/mason/core/managers/powershell/init.lua
@@ -1,5 +1,5 @@
-local spawn = require "nvim-lsp-installer.core.spawn"
-local process = require "nvim-lsp-installer.core.process"
+local spawn = require "mason.core.spawn"
+local process = require "mason.core.process"
local M = {}
@@ -9,8 +9,8 @@ local PWSHOPT = {
}
---@param script string
----@param opts JobSpawnOpts
----@param custom_spawn JobSpawn
+---@param opts JobSpawnOpts | nil
+---@param custom_spawn JobSpawn | nil
function M.script(script, opts, custom_spawn)
opts = opts or {}
---@type JobSpawn
@@ -29,8 +29,8 @@ function M.script(script, opts, custom_spawn)
end
---@param command string
----@param opts JobSpawnOpts
----@param custom_spawn JobSpawn
+---@param opts JobSpawnOpts | nil
+---@param custom_spawn JobSpawn | nil
function M.command(command, opts, custom_spawn)
opts = opts or {}
---@type JobSpawn
diff --git a/lua/nvim-lsp-installer/core/managers/std/init.lua b/lua/mason/core/managers/std/init.lua
index e46a1045..df368079 100644
--- a/lua/nvim-lsp-installer/core/managers/std/init.lua
+++ b/lua/mason/core/managers/std/init.lua
@@ -1,10 +1,10 @@
-local a = require "nvim-lsp-installer.core.async"
-local installer = require "nvim-lsp-installer.core.installer"
-local fetch = require "nvim-lsp-installer.core.fetch"
-local platform = require "nvim-lsp-installer.core.platform"
-local powershell = require "nvim-lsp-installer.core.managers.powershell"
-local path = require "nvim-lsp-installer.core.path"
-local Result = require "nvim-lsp-installer.core.result"
+local a = require "mason.core.async"
+local installer = require "mason.core.installer"
+local fetch = require "mason.core.fetch"
+local platform = require "mason.core.platform"
+local powershell = require "mason.core.managers.powershell"
+local path = require "mason.core.path"
+local Result = require "mason.core.result"
local M = {}
@@ -104,12 +104,13 @@ end
---@async
---@param file string
----@param opts {strip_components:integer}
+---@param opts {strip_components:integer}|nil
function M.untar(file, opts)
opts = opts or {}
local ctx = installer.context()
ctx.spawn.tar {
opts.strip_components and { "--strip-components", opts.strip_components } or vim.NIL,
+ "--no-same-owner",
"-xvf",
file,
}
@@ -120,7 +121,7 @@ end
---@async
---@param file string
----@param opts {strip_components:integer}
+---@param opts {strip_components:integer}|nil
function M.untarxz(file, opts)
opts = opts or {}
local ctx = installer.context()
diff --git a/lua/nvim-lsp-installer/core/optional.lua b/lua/mason/core/optional.lua
index 10af8ccb..10af8ccb 100644
--- a/lua/nvim-lsp-installer/core/optional.lua
+++ b/lua/mason/core/optional.lua
diff --git a/lua/mason/core/package/indexer.lua b/lua/mason/core/package/indexer.lua
new file mode 100644
index 00000000..566c1035
--- /dev/null
+++ b/lua/mason/core/package/indexer.lua
@@ -0,0 +1,89 @@
+local log = require "mason.log"
+local fs = require "mason.core.fs"
+local _ = require "mason.core.functional"
+local pkg_index = require "mason._generated.package_index"
+local Optional = require "mason.core.optional"
+local path = require "mason.core.path"
+local EventEmitter = require "mason.core.EventEmitter"
+
+local M = setmetatable({}, { __index = EventEmitter })
+EventEmitter.init(M)
+
+local scan_install_root
+
+do
+ ---@type table<string, true>
+ local cached_dirs
+
+ local get_directories = _.compose(
+ _.set_of,
+ _.filter_map(function(entry)
+ if entry.type == "directory" and pkg_index[entry.name] then
+ return Optional.of(entry.name)
+ else
+ return Optional.empty()
+ end
+ end)
+ )
+
+ ---@return table<string, true>
+ scan_install_root = function()
+ if cached_dirs then
+ return cached_dirs
+ end
+ log.trace "Scanning installation root dir"
+ ---@type string[]
+ local ok, entries = pcall(fs.sync.readdir, path.package_prefix())
+ if not ok then
+ log.debug("Failed to scan installation root dir", entries)
+ -- presume installation root dir has not been created yet (i.e., no packages installed)
+ return {}
+ end
+ cached_dirs = get_directories(entries)
+ vim.schedule(function()
+ cached_dirs = nil
+ end)
+ log.trace("Resolved installation root dirs", cached_dirs)
+ return cached_dirs
+ end
+end
+
+---@param package_name string
+function M.is_installed(package_name)
+ return scan_install_root()[package_name] == true
+end
+
+---@param package_name string
+---@return Package
+function M.get_package(package_name)
+ local ok, pkg = pcall(require, pkg_index[package_name])
+ if not ok then
+ log.error(pkg)
+ error(("Cannot find package %q."):format(package_name))
+ end
+ return pkg
+end
+
+local get_packages = _.map(M.get_package)
+
+---@return string[]
+function M.get_installed_package_names()
+ return _.keys(scan_install_root())
+end
+
+---@return Package[]
+function M.get_installed_packages()
+ return get_packages(M.get_installed_package_names())
+end
+
+---@return string[]
+function M.get_all_package_names()
+ return _.keys(pkg_index)
+end
+
+---@return Package[]
+function M.get_all_packages()
+ return get_packages(M.get_all_package_names())
+end
+
+return M
diff --git a/lua/mason/core/package/init.lua b/lua/mason/core/package/init.lua
new file mode 100644
index 00000000..994a15a9
--- /dev/null
+++ b/lua/mason/core/package/init.lua
@@ -0,0 +1,205 @@
+local a = require "mason.core.async"
+local _ = require "mason.core.functional"
+local installer = require "mason.core.installer"
+local InstallationHandle = require "mason.core.installer.handle"
+local Optional = require "mason.core.optional"
+local log = require "mason.log"
+local EventEmitter = require "mason.core.EventEmitter"
+local indexer = require "mason.core.package.indexer"
+local receipt = require "mason.core.receipt"
+local fs = require "mason.core.fs"
+local path = require "mason.core.path"
+local linker = require "mason.core.installer.linker"
+
+local version_checks = require "mason.core.package.version-check"
+
+---@class Package : EventEmitter
+---@field name string
+---@field spec PackageSpec
+---@field private handle InstallHandle @The currently associated handle.
+local Package = setmetatable({}, { __index = EventEmitter })
+
+---@param package_identifier string
+---@return string, string | nil
+Package.Parse = function(package_identifier)
+ local name, version = unpack(vim.split(package_identifier, "@"))
+ return name, version
+end
+
+---@alias PackageLanguage string
+
+---@type table<PackageLanguage, PackageLanguage>
+Package.Lang = setmetatable({}, {
+ __index = function(s, lang)
+ s[lang] = lang
+ return s[lang]
+ end,
+})
+
+---@class PackageCategory
+Package.Cat = {
+ Compiler = "Compiler",
+ Runtime = "Runtime",
+ DAP = "DAP",
+ LSP = "LSP",
+ Linter = "Linter",
+ Formatter = "Formatter",
+}
+
+local PackageMt = { __index = Package }
+
+---@class PackageSpec
+---@field name string
+---@field desc string
+---@field homepage string
+---@field categories PackageCategory[]
+---@field languages PackageLanguage[]
+---@field install async fun(ctx: InstallContext)
+
+---@param spec PackageSpec
+function Package.new(spec)
+ vim.validate {
+ name = { spec.name, "s" },
+ desc = { spec.desc, "s" },
+ homepage = { spec.homepage, "s" },
+ categories = { spec.categories, "t" },
+ languages = { spec.languages, "t" },
+ install = { spec.install, "f" },
+ }
+
+ return EventEmitter.init(setmetatable({
+ name = spec.name, -- for convenient access
+ spec = spec,
+ }, PackageMt))
+end
+
+function Package:new_handle()
+ self:get_handle():if_present(function(handle)
+ assert(handle:is_closed(), "Cannot create new handle because existing handle is not closed.")
+ end)
+ log.fmt_trace("Creating new handle for %s", self)
+ local handle = InstallationHandle.new(self)
+ self.handle = handle
+ self:emit("handle", handle)
+ return handle
+end
+
+---@param opts { version: string|nil } | nil
+---@return InstallHandle
+function Package:install(opts)
+ opts = opts or {}
+ return self
+ :get_handle()
+ :map(function(handle)
+ if not handle:is_closed() then
+ log.fmt_debug("Handle %s already exist for package %s", handle, self)
+ return handle
+ end
+ end)
+ :or_else_get(function()
+ local handle = self:new_handle()
+ -- This function is not expected to be run in async scope, so we create
+ -- a new scope here and handle the result callback-style.
+ a.run(
+ installer.execute,
+ ---@param success boolean
+ ---@param result Result
+ function(success, result)
+ if not success then
+ log.error("Unexpected error", result)
+ self:emit("install:failed", handle)
+ return
+ end
+ result
+ :on_success(function()
+ self:emit("install:success", handle)
+ indexer:emit("package:install:success", self, handle)
+ end)
+ :on_failure(function()
+ self:emit("install:failed", handle)
+ indexer:emit("package:install:failed", self, handle)
+ end)
+ end,
+ handle,
+ {
+ requested_version = opts.version,
+ }
+ )
+ return handle
+ end)
+end
+
+function Package:uninstall()
+ local was_unlinked = self:unlink()
+ if was_unlinked then
+ self:emit "uninstall:success"
+ end
+ return was_unlinked
+end
+
+function Package:unlink()
+ log.fmt_info("Unlinking %s", self)
+ local install_path = self:get_install_path()
+ -- 1. Unlink
+ self:get_receipt():map(_.prop "links"):if_present(function(links)
+ linker.unlink(self, links)
+ end)
+
+ -- 2. Remove installation artifacts
+ if fs.sync.dir_exists(install_path) then
+ fs.sync.rmrf(install_path)
+ return true
+ end
+ return false
+end
+
+function Package:is_installed()
+ return indexer.is_installed(self.name)
+end
+
+function Package:get_handle()
+ return Optional.of_nilable(self.handle)
+end
+
+function Package:get_install_path()
+ return path.package_prefix(self.name)
+end
+
+---@return Optional @Optional<@see InstallReceipt>
+function Package:get_receipt()
+ local receipt_path = path.concat { self:get_install_path(), "mason-receipt.json" }
+ if fs.sync.file_exists(receipt_path) then
+ return Optional.of(receipt.InstallReceipt.from_json(vim.json.decode(fs.sync.read_file(receipt_path))))
+ end
+ return Optional.empty()
+end
+
+---@param callback fun(success: boolean, version_or_err: string)
+function Package:get_installed_version(callback)
+ a.run(function()
+ local receipt = self:get_receipt():or_else_throw "Unable to get receipt."
+ return version_checks.get_installed_version(receipt, self:get_install_path()):get_or_throw()
+ end, callback)
+end
+
+---@param callback fun(success: boolean, result_or_err: NewPackageVersion)
+function Package:check_new_version(callback)
+ a.run(function()
+ local receipt = self:get_receipt():or_else_throw "Unable to get receipt."
+ return version_checks.get_new_version(receipt, self:get_install_path()):get_or_throw()
+ end, callback)
+end
+
+function Package:get_lsp_settings_schema()
+ local ok, schema = pcall(require, ("mason._generated.lsp-schemas.%s"):format(self.name))
+ if not ok then
+ return Optional.empty()
+ end
+ return Optional.of(schema)
+end
+
+function PackageMt.__tostring(self)
+ return ("Package(name=%s)"):format(self.name)
+end
+
+return Package
diff --git a/lua/mason/core/package/version-check.lua b/lua/mason/core/package/version-check.lua
new file mode 100644
index 00000000..484db0e9
--- /dev/null
+++ b/lua/mason/core/package/version-check.lua
@@ -0,0 +1,89 @@
+local Result = require "mason.core.result"
+local cargo = require "mason.core.managers.cargo"
+local composer = require "mason.core.managers.composer"
+local eclipse = require "mason.core.clients.eclipse"
+local gem = require "mason.core.managers.gem"
+local git = require "mason.core.managers.git"
+local github = require "mason.core.managers.github"
+local go = require "mason.core.managers.go"
+local luarocks = require "mason.core.managers.luarocks"
+local npm = require "mason.core.managers.npm"
+local pip3 = require "mason.core.managers.pip3"
+
+---@param field_name string
+local function version_in_receipt(field_name)
+ ---@param receipt InstallReceipt
+ ---@return Result
+ return function(receipt)
+ return Result.success(receipt.primary_source[field_name])
+ end
+end
+
+---@type table<InstallReceiptSourceType, async fun(receipt: InstallReceipt, install_dir: string): Result>
+local get_installed_version_by_type = {
+ ["npm"] = npm.get_installed_primary_package_version,
+ ["pip3"] = pip3.get_installed_primary_package_version,
+ ["gem"] = gem.get_installed_primary_package_version,
+ ["cargo"] = cargo.get_installed_primary_package_version,
+ ["composer"] = composer.get_installed_primary_package_version,
+ ["git"] = git.get_installed_revision,
+ ["go"] = go.get_installed_primary_package_version,
+ ["luarocks"] = luarocks.get_installed_primary_package_version,
+ ["github_release_file"] = version_in_receipt "release",
+ ["github_release"] = version_in_receipt "release",
+ ["github_tag"] = version_in_receipt "tag",
+ ["jdtls"] = version_in_receipt "version",
+}
+
+---@async
+---@param receipt InstallReceipt
+local function jdtls_check(receipt)
+ return eclipse.fetch_latest_jdtls_version():map_catching(function(latest_version)
+ if receipt.primary_source.version ~= latest_version then
+ return {
+ name = "jdtls",
+ current_version = receipt.primary_source.version,
+ latest_version = latest_version,
+ }
+ end
+ error "Primary package is not outdated."
+ end)
+end
+
+---@class NewPackageVersion
+---@field name string
+---@field current_version string
+---@field latest_version string
+
+local get_new_version_by_type = {
+ ["npm"] = npm.check_outdated_primary_package,
+ ["pip3"] = pip3.check_outdated_primary_package,
+ ["git"] = git.check_outdated_git_clone,
+ ["cargo"] = cargo.check_outdated_primary_package,
+ ["composer"] = composer.check_outdated_primary_package,
+ ["gem"] = gem.check_outdated_primary_package,
+ ["go"] = go.check_outdated_primary_package,
+ ["luarocks"] = luarocks.check_outdated_primary_package,
+ ["jdtls"] = jdtls_check,
+ ["github_release_file"] = github.check_outdated_primary_package_release,
+ ["github_release"] = github.check_outdated_primary_package_release,
+ ["github_tag"] = github.check_outdated_primary_package_tag,
+}
+
+---@param provider_mapping table<string, async fun(receipt: InstallReceipt, install_dir: string)>: Result
+local function version_check(provider_mapping)
+ ---@param receipt InstallReceipt
+ ---@param install_dir string
+ return function(receipt, install_dir)
+ local check = provider_mapping[receipt.primary_source.type]
+ if not check then
+ return Result.failure(( "Packages installed via %s does not yet support version check."):format(receipt.primary_source.type))
+ end
+ return check(receipt, install_dir)
+ end
+end
+
+return {
+ get_installed_version = version_check(get_installed_version_by_type),
+ get_new_version = version_check(get_new_version_by_type),
+}
diff --git a/lua/nvim-lsp-installer/core/path.lua b/lua/mason/core/path.lua
index 2f0fd84b..2060c186 100644
--- a/lua/nvim-lsp-installer/core/path.lua
+++ b/lua/mason/core/path.lua
@@ -1,5 +1,3 @@
-local uv = vim.loop
-
local sep = (function()
---@diagnostic disable-next-line: undefined-global
if jit then
@@ -17,10 +15,6 @@ end)()
local M = {}
-function M.cwd()
- return uv.fs_realpath "."
-end
-
---@param path_components string[]
---@return string
function M.concat(path_components)
@@ -33,4 +27,25 @@ function M.is_subdirectory(root_path, path)
return root_path == path or path:sub(1, #root_path + 1) == root_path .. sep
end
+---@param dir string|nil
+function M.install_prefix(dir)
+ local settings = require "mason.settings"
+ return M.concat { settings.current.install_root_dir, dir }
+end
+
+---@param executable string|nil
+function M.bin_prefix(executable)
+ return M.concat { M.install_prefix "bin", executable }
+end
+
+---@param name string|nil
+function M.package_prefix(name)
+ return M.concat { M.install_prefix "packages", name }
+end
+
+---@param name string|nil
+function M.package_build_prefix(name)
+ return M.concat { M.install_prefix ".packages", name }
+end
+
return M
diff --git a/lua/nvim-lsp-installer/core/platform.lua b/lua/mason/core/platform.lua
index 10427a63..76ecb7e5 100644
--- a/lua/nvim-lsp-installer/core/platform.lua
+++ b/lua/mason/core/platform.lua
@@ -1,5 +1,5 @@
-local _ = require "nvim-lsp-installer.core.functional"
-local Result = require "nvim-lsp-installer.core.result"
+local fun = require "mason.core.functional.function"
+
local M = {}
local uname = vim.loop.os_uname()
@@ -59,7 +59,9 @@ function M.when(cases)
end
---@type async fun(): table
-M.os_distribution = _.lazy(function()
+M.os_distribution = fun.lazy(function()
+ local Result = require "mason.core.result"
+
---Parses the provided contents of an /etc/\*-release file and identifies the Linux distribution.
---@param contents string @The contents of a /etc/\*-release file.
---@return table<string, any>
@@ -99,7 +101,7 @@ M.os_distribution = _.lazy(function()
return M.when {
linux = function()
- local spawn = require "nvim-lsp-installer.core.spawn"
+ local spawn = require "mason.core.spawn"
return spawn.bash({ "-c", "cat /etc/*-release" })
:map_catching(function(result)
return parse_linux_dist(result.stdout)
@@ -119,9 +121,9 @@ M.os_distribution = _.lazy(function()
end)
---@type async fun() Result @of String
-M.get_homebrew_prefix = _.lazy(function()
+M.get_homebrew_prefix = fun.lazy(function()
assert(M.is_mac, "Can only locate Homebrew installation on Mac systems.")
- local spawn = require "nvim-lsp-installer.core.spawn"
+ local spawn = require "mason.core.spawn"
return spawn.brew({ "--prefix" })
:map_catching(function(result)
return vim.trim(result.stdout)
@@ -132,7 +134,7 @@ M.get_homebrew_prefix = _.lazy(function()
end)
-- @return string @The libc found on the system, musl or glibc (glibc if ldd is not found)
-M.get_libc = _.lazy(function()
+M.get_libc = fun.lazy(function()
local _, _, libc_exit_code = os.execute "ldd --version 2>&1 | grep -q musl"
if libc_exit_code == 0 then
return "musl"
@@ -141,6 +143,7 @@ M.get_libc = _.lazy(function()
end
end)
+---@type table<string, boolean>
M.is = setmetatable({}, {
__index = function(_, key)
local platform, arch = unpack(vim.split(key, "_", { plain = true }))
diff --git a/lua/nvim-lsp-installer/core/process.lua b/lua/mason/core/process.lua
index 9841c11c..b810d1c6 100644
--- a/lua/nvim-lsp-installer/core/process.lua
+++ b/lua/mason/core/process.lua
@@ -1,6 +1,6 @@
-local log = require "nvim-lsp-installer.log"
-local _ = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
+local log = require "mason.log"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
local uv = vim.loop
---@alias luv_pipe any
@@ -84,7 +84,7 @@ local function sanitize_env_list(env_list)
return sanitized_list
end
----@alias JobSpawnCallback fun(success: boolean, exit_code: integer)
+---@alias JobSpawnCallback fun(success: boolean, exit_code: integer, signal: integer)
---@class JobSpawnOpts
---@field env string[] @List of "key=value" string.
@@ -95,7 +95,7 @@ end
---@param cmd string @The command/executable.
---@param opts JobSpawnOpts
---@param callback JobSpawnCallback
----@return luv_handle,luv_pipe[]|nil @Returns the job handle and the stdio array on success, otherwise returns nil.
+---@return luv_handle,luv_pipe[],integer @Returns the job handle and the stdio array on success, otherwise returns nil.
function M.spawn(cmd, opts, callback)
local stdin = uv.new_pipe(false)
local stdout = uv.new_pipe(false)
@@ -141,7 +141,7 @@ function M.spawn(cmd, opts, callback)
end
end
check:stop()
- callback(successful, exit_code)
+ callback(successful, exit_code, signal)
end)
log.fmt_debug("Job pid=%s exited with exit_code=%s, signal=%s", pid_or_err, exit_code, signal)
@@ -163,44 +163,7 @@ function M.spawn(cmd, opts, callback)
stdout:read_start(connect_sink(stdout, opts.stdio_sink.stdout))
stderr:read_start(connect_sink(stderr, opts.stdio_sink.stderr))
- return handle, stdio
-end
-
----@param opts JobSpawnOpts @The job spawn opts to apply in every job in this "chain".
-function M.chain(opts)
- local jobs = {}
- return {
- ---@param cmd string
- ---@param args string[]
- run = function(cmd, args)
- jobs[#jobs + 1] = M.lazy_spawn(
- cmd,
- vim.tbl_deep_extend("force", opts, {
- args = args,
- })
- )
- end,
- ---@param callback JobSpawnCallback
- spawn = function(callback)
- local function execute(idx)
- local ok, err = pcall(jobs[idx], function(successful)
- if successful and jobs[idx + 1] then
- -- iterate
- execute(idx + 1)
- else
- -- we done
- callback(successful)
- end
- end)
- if not ok then
- log.fmt_error("Chained job failed to execute. Error=%s", tostring(err))
- callback(false)
- end
- end
-
- execute(1)
- end,
- }
+ return handle, stdio, pid_or_err
end
function M.empty_sink()
@@ -219,96 +182,32 @@ function M.simple_sink()
end
function M.in_memory_sink()
- local buffers = { stdout = {}, stderr = {} }
+ local stdout, stderr = {}, {}
return {
- buffers = buffers,
+ buffers = { stdout = stdout, stderr = stderr },
sink = {
stdout = function(chunk)
- buffers.stdout[#buffers.stdout + 1] = chunk
+ stdout[#stdout + 1] = chunk
end,
stderr = function(chunk)
- buffers.stderr[#buffers.stderr + 1] = chunk
+ stderr[#stderr + 1] = chunk
end,
},
}
end
---- This probably belongs elsewhere ¯\_(ツ)_/¯
----@generic T
----@param debounced_fn fun(arg1: T)
----@return fun(arg1: T)
-function M.debounced(debounced_fn)
- local queued = false
- local last_arg = nil
- return function(a)
- last_arg = a
- if queued then
- return
- end
- queued = true
- vim.schedule(function()
- debounced_fn(last_arg)
- queued = false
- last_arg = nil
- end)
+---@param luv_handle luv_handle
+---@param signal integer
+function M.kill(luv_handle, signal)
+ assert(type(signal) == "number", "signal is not a number")
+ assert(signal > 0 and signal < 32, "signal must be between 1-31")
+ log.fmt_trace("Sending signal %s to handle %s", signal, luv_handle)
+ local ok, is_active = pcall(uv.is_active, luv_handle)
+ if not ok or not is_active then
+ log.fmt_trace("Tried to send signal %s to inactive uv handle.", signal)
+ return
end
-end
-
----@alias LazyJob fun(callback: JobSpawnCallback)
-
----@param cmd string
----@param opts JobSpawnOpts
-function M.lazy_spawn(cmd, opts)
- ---@param callback JobSpawnCallback
- return function(callback)
- return M.spawn(cmd, opts, callback)
- end
-end
-
----@class JobAttemptOpts
----@field jobs LazyJob[]
----@field on_finish JobSpawnCallback
----@field on_iterate fun()
-
----@param opts JobAttemptOpts
-function M.attempt(opts)
- local jobs, on_finish, on_iterate = opts.jobs, opts.on_finish, opts.on_iterate
- if #jobs == 0 then
- error "process.attempt(...) needs at least one job."
- end
-
- local spawn, on_job_exit
-
- on_job_exit = function(cur_idx, success)
- if success then
- -- this job succeeded. exit early
- on_finish(true)
- elseif jobs[cur_idx + 1] then
- -- iterate
- if on_iterate then
- on_iterate()
- end
- log.debug "Previous job failed, attempting next."
- spawn(cur_idx + 1)
- else
- -- we exhausted all jobs without success
- log.debug "All jobs failed."
- on_finish(false)
- end
- end
-
- spawn = function(idx)
- local ok, err = pcall(jobs[idx], function(success)
- on_job_exit(idx, success)
- end)
- if not ok then
- log.fmt_error("Job failed to execute. Error=%s", tostring(err))
- on_job_exit(idx, false)
- on_finish(false)
- end
- end
-
- spawn(1)
+ uv.process_kill(luv_handle, signal)
end
return M
diff --git a/lua/nvim-lsp-installer/core/receipt.lua b/lua/mason/core/receipt.lua
index 608673a6..233715fe 100644
--- a/lua/nvim-lsp-installer/core/receipt.lua
+++ b/lua/mason/core/receipt.lua
@@ -2,7 +2,6 @@ local M = {}
---@alias InstallReceiptSchemaVersion
---| '"1.0"'
----| '"1.0a"'
---@alias InstallReceiptSourceType
---| '"npm"'
@@ -23,25 +22,25 @@ local M = {}
---@alias InstallReceiptSource {type: InstallReceiptSourceType}
+---@class InstallReceiptLinks
+---@field bin table<string, string>
+
---@class InstallReceiptBuilder
----@field public is_marked_invalid boolean Whether this instance of the builder has been marked as invalid. This is an exception that only apply to a few select servers whose installation is not yet compatible with the receipt schema due to having a too complicated installation structure.
---@field private secondary_sources InstallReceiptSource[]
+---@field private links InstallReceiptLinks
---@field private epoch_time number
local InstallReceiptBuilder = {}
InstallReceiptBuilder.__index = InstallReceiptBuilder
function InstallReceiptBuilder.new()
return setmetatable({
- is_marked_invalid = false,
secondary_sources = {},
+ links = {
+ bin = vim.empty_dict(),
+ },
}, InstallReceiptBuilder)
end
-function InstallReceiptBuilder:mark_invalid()
- self.is_marked_invalid = true
- return self
-end
-
---@param name string
function InstallReceiptBuilder:with_name(name)
self.name = name
@@ -66,6 +65,15 @@ function InstallReceiptBuilder:with_secondary_source(source)
return self
end
+---@param typ '"bin"'
+---@param name string
+---@param rel_path string
+function InstallReceiptBuilder:with_link(typ, name, rel_path)
+ assert(not self.links[typ][name], ("%s/%s has already been linked."):format(typ, name))
+ self.links[typ][name] = rel_path
+ return self
+end
+
---@param seconds integer
---@param microseconds integer
local function to_ms(seconds, microseconds)
@@ -103,6 +111,7 @@ function InstallReceiptBuilder:build()
},
primary_source = self.primary_source,
secondary_sources = self.secondary_sources,
+ links = self.links,
}
end
@@ -153,6 +162,7 @@ end
---@field public metrics {start_time:integer, completion_time:integer}
---@field public primary_source InstallReceiptSource
---@field public secondary_sources InstallReceiptSource[]
+---@field public links InstallReceiptLinks
local InstallReceipt = {}
InstallReceipt.__index = InstallReceipt
diff --git a/lua/nvim-lsp-installer/core/result.lua b/lua/mason/core/result.lua
index 132e2758..132e2758 100644
--- a/lua/nvim-lsp-installer/core/result.lua
+++ b/lua/mason/core/result.lua
diff --git a/lua/nvim-lsp-installer/core/spawn.lua b/lua/mason/core/spawn.lua
index 13e05a5b..60399361 100644
--- a/lua/nvim-lsp-installer/core/spawn.lua
+++ b/lua/mason/core/spawn.lua
@@ -1,9 +1,9 @@
-local a = require "nvim-lsp-installer.core.async"
-local Result = require "nvim-lsp-installer.core.result"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local log = require "nvim-lsp-installer.log"
+local a = require "mason.core.async"
+local _ = require "mason.core.functional"
+local Result = require "mason.core.result"
+local process = require "mason.core.process"
+local platform = require "mason.core.platform"
+local log = require "mason.log"
---@alias JobSpawn table<string, async fun(opts: JobSpawnOpts): Result>
---@type JobSpawn
@@ -15,38 +15,30 @@ local spawn = {
gradlew = platform.is_win and "gradlew.bat" or "gradlew",
-- for hererocks installations
luarocks = (platform.is_win and vim.fn.executable "luarocks.bat" == 1) and "luarocks.bat" or "luarocks",
+ rebar3 = platform.is_win and "rebar3.cmd" or "rebar3"
},
+ _flatten_cmd_args = _.compose(_.filter(_.complement(_.equals(vim.NIL))), _.flatten),
}
local function Failure(err, cmd)
return Result.failure(setmetatable(err, {
__tostring = function()
- if err.exit_code ~= nil then
- return ("spawn: %s failed with exit code %d. %s"):format(cmd, err.exit_code, err.stderr or "")
- else
- return ("spawn: %s failed with no exit code. %s"):format(cmd, err.stderr or "")
- end
+ return ("spawn: %s failed with exit code %s and signal %s. %s"):format(
+ cmd,
+ err.exit_code or "-",
+ err.signal or "-",
+ err.stderr or ""
+ )
end,
}))
end
-local function parse_args(args, dest)
- for _, arg in ipairs(args) do
- if type(arg) == "table" then
- parse_args(arg, dest)
- elseif arg ~= vim.NIL then
- dest[#dest + 1] = arg
- end
- end
- return dest
-end
-
-local is_executable = functional.memoize(function(cmd)
+local is_executable = _.memoize(function(cmd)
if vim.in_fast_event() then
a.scheduler()
end
return vim.fn.executable(cmd) == 1
-end, functional.identity)
+end, _.identity)
---@class SpawnArgs
---@field with_paths string[] @Optional. Paths to add to the PATH environment variable.
@@ -62,9 +54,7 @@ setmetatable(spawn, {
__index = function(self, normalized_cmd)
---@param args SpawnArgs
return function(args)
- local cmd_args = {}
- parse_args(args, cmd_args)
-
+ local cmd_args = self._flatten_cmd_args(args)
local env = args.env
if args.with_paths then
@@ -95,14 +85,14 @@ setmetatable(spawn, {
}, cmd)
end
- local _, exit_code = a.wait(function(resolve)
- local handle, stdio = process.spawn(cmd, spawn_args, resolve)
- if args.on_spawn and handle and stdio then
- args.on_spawn(handle, stdio)
+ local _, exit_code, signal = a.wait(function(resolve)
+ local handle, stdio, pid = process.spawn(cmd, spawn_args, resolve)
+ if args.on_spawn and handle and stdio and pid then
+ args.on_spawn(handle, stdio, pid)
end
end)
- if exit_code == 0 then
+ if exit_code == 0 and signal == 0 then
return Result.success {
stdout = stdio and table.concat(stdio.buffers.stdout, "") or nil,
stderr = stdio and table.concat(stdio.buffers.stderr, "") or nil,
@@ -110,6 +100,7 @@ setmetatable(spawn, {
else
return Failure({
exit_code = exit_code,
+ signal = signal,
stdout = stdio and table.concat(stdio.buffers.stdout, "") or nil,
stderr = stdio and table.concat(stdio.buffers.stderr, "") or nil,
}, cmd)
diff --git a/lua/nvim-lsp-installer/core/ui/display.lua b/lua/mason/core/ui/display.lua
index 5e4618f5..7e45c49b 100644
--- a/lua/nvim-lsp-installer/core/ui/display.lua
+++ b/lua/mason/core/ui/display.lua
@@ -1,9 +1,28 @@
-local log = require "nvim-lsp-installer.log"
-local process = require "nvim-lsp-installer.core.process"
-local state = require "nvim-lsp-installer.core.ui.state"
+local log = require "mason.log"
+local state = require "mason.core.ui.state"
local M = {}
+---@generic T
+---@param debounced_fn fun(arg1: T)
+---@return fun(arg1: T)
+local function debounced(debounced_fn)
+ local queued = false
+ local last_arg = nil
+ return function(a)
+ last_arg = a
+ if queued then
+ return
+ end
+ queued = true
+ vim.schedule(function()
+ debounced_fn(last_arg)
+ queued = false
+ last_arg = nil
+ end)
+ end
+end
+
---@param line string
---@param render_context RenderContext
local function get_styles(line, render_context)
@@ -62,6 +81,7 @@ local function render_node(viewport_context, node, _render_context, _output)
---@field highlights RenderHighlight[]
---@field keybinds RenderKeybind[]
---@field diagnostics RenderDiagnostic[]
+ ---@field sticky_cursors { line_map: table<number, string>, id_map: table<string, number> }
local output = _output
or {
lines = {},
@@ -69,6 +89,7 @@ local function render_node(viewport_context, node, _render_context, _output)
highlights = {},
keybinds = {},
diagnostics = {},
+ sticky_cursors = { line_map = {}, id_map = {} },
}
if node.type == "VIRTUAL_TEXT" then
@@ -133,6 +154,9 @@ local function render_node(viewport_context, node, _render_context, _output)
severity = node.diagnostic.severity,
source = node.diagnostic.source,
}
+ elseif node.type == "STICKY_CURSOR" then
+ output.sticky_cursors.id_map[node.id] = #output.lines
+ output.sticky_cursors.line_map[#output.lines] = node.id
end
return output
@@ -141,7 +165,9 @@ end
-- exported for tests
M._render_node = render_node
----@param opts DisplayOpenOpts
+---@alias WindowOpts {effects: table<string, fun()>, highlight_groups: table<string, table>, border: string|table}
+
+---@param opts WindowOpenOpts
---@param sizes_only boolean @Whether to only return properties that control the window size.
local function create_popup_window_opts(opts, sizes_only)
local win_height = vim.o.lines - vim.o.cmdheight - 2 -- Add margin for status and buffer line
@@ -155,7 +181,7 @@ local function create_popup_window_opts(opts, sizes_only)
col = math.floor((win_width - width) / 2),
relative = "editor",
style = "minimal",
- zindex = 1,
+ zindex = 50,
}
if not sizes_only then
@@ -165,10 +191,14 @@ local function create_popup_window_opts(opts, sizes_only)
return popup_layout
end
-function M.new_view_only_win(name)
- local namespace = vim.api.nvim_create_namespace(("lsp_installer_%s"):format(name))
+---@param name string @Human readable identifier.
+---@param filetype string
+function M.new_view_only_win(name, filetype)
+ local namespace = vim.api.nvim_create_namespace(("installer_%s"):format(name))
local bufnr, renderer, mutate_state, get_state, unsubscribe, win_id, window_mgmt_augroup, autoclose_augroup, registered_keymaps, registered_keybinds, registered_effect_handlers
local has_initiated = false
+ ---@type WindowOpts
+ local window_opts = {}
local function delete_win_buf()
-- We queue the win_buf to be deleted in a schedule call, otherwise when used with folke/which-key (and
@@ -211,6 +241,7 @@ function M.new_view_only_win(name)
call_effect_handler(-1, key) -- global keybinds
end
+ local output
local draw = function(view)
local win_valid = win_id ~= nil and vim.api.nvim_win_is_valid(win_id)
local buf_valid = bufnr ~= nil and vim.api.nvim_buf_is_valid(bufnr)
@@ -229,7 +260,13 @@ function M.new_view_only_win(name)
local viewport_context = {
win_width = win_width,
}
- local output = render_node(viewport_context, view)
+ local cursor_pos_pre_render = vim.api.nvim_win_get_cursor(win_id)
+ local sticky_cursor
+ if output then
+ sticky_cursor = output.sticky_cursors.line_map[cursor_pos_pre_render[1]]
+ end
+
+ output = render_node(viewport_context, view)
local lines, virt_texts, highlights, keybinds, diagnostics =
output.lines, output.virt_texts, output.highlights, output.keybinds, output.diagnostics
@@ -239,6 +276,14 @@ function M.new_view_only_win(name)
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
vim.api.nvim_buf_set_option(bufnr, "modifiable", false)
+ -- restore sticky cursor position
+ if sticky_cursor then
+ local new_sticky_cursor_line = output.sticky_cursors.id_map[sticky_cursor]
+ if new_sticky_cursor_line and new_sticky_cursor_line ~= cursor_pos_pre_render then
+ vim.api.nvim_win_set_cursor(win_id, { new_sticky_cursor_line, cursor_pos_pre_render[2] })
+ end
+ end
+
-- set virtual texts
for i = 1, #virt_texts do
local virt_text = virt_texts[i]
@@ -299,14 +344,12 @@ function M.new_view_only_win(name)
end
end
- ---@param opts DisplayOpenOpts
+ ---@param opts WindowOpenOpts
local function open(opts)
- opts = opts or {}
- local highlight_groups = opts.highlight_groups
bufnr = vim.api.nvim_create_buf(false, true)
win_id = vim.api.nvim_open_win(bufnr, true, create_popup_window_opts(opts, false))
- registered_effect_handlers = opts.effects
+ registered_effect_handlers = window_opts.effects
registered_keybinds = {}
registered_keymaps = {}
@@ -317,7 +360,7 @@ function M.new_view_only_win(name)
buftype = "nofile",
bufhidden = "wipe",
buflisted = false,
- filetype = "lsp-installer",
+ filetype = filetype,
undolevels = -1,
}
@@ -344,8 +387,8 @@ function M.new_view_only_win(name)
vim.cmd [[ syntax clear ]]
- window_mgmt_augroup = vim.api.nvim_create_augroup("LspInstallerWindowMgmt", {})
- autoclose_augroup = vim.api.nvim_create_augroup("LspInstallerWindow", {})
+ window_mgmt_augroup = vim.api.nvim_create_augroup("MasonWindowMgmt", {})
+ autoclose_augroup = vim.api.nvim_create_augroup("MasonWindow", {})
vim.api.nvim_create_autocmd({ "VimResized" }, {
group = window_mgmt_augroup,
@@ -353,7 +396,7 @@ function M.new_view_only_win(name)
callback = function()
if vim.api.nvim_win_is_valid(win_id) then
draw(renderer(get_state()))
- vim.api.nvim_win_set_config(win_id, create_popup_window_opts(opts, true))
+ vim.api.nvim_win_set_config(win_id, create_popup_window_opts(window_opts, true))
end
end,
})
@@ -386,13 +429,6 @@ function M.new_view_only_win(name)
end,
})
- if highlight_groups then
- for i = 1, #highlight_groups do
- -- TODO use vim.api.nvim_set_hl()
- vim.cmd(highlight_groups[i])
- end
- end
-
return win_id
end
@@ -401,16 +437,17 @@ function M.new_view_only_win(name)
view = function(_renderer)
renderer = _renderer
end,
+ ---@param _effects table<string, fun()>
+ effects = function(_effects)
+ window_opts.effects = _effects
+ end,
---@generic T : table
---@param initial_state T
---@return fun(mutate_fn: fun(current_state: T)), fun(): T
- init = function(initial_state)
- assert(renderer ~= nil, "No view function has been registered. Call .view() before .init().")
- has_initiated = true
-
+ state = function(initial_state)
mutate_state, get_state, unsubscribe = state.create_state_container(
initial_state,
- process.debounced(function(new_state)
+ debounced(function(new_state)
draw(renderer(new_state))
end)
)
@@ -420,8 +457,20 @@ function M.new_view_only_win(name)
return mutate_state, get_state
end,
- ---@alias DisplayOpenOpts {effects: table<string, fun()>, highlight_groups: string[]|nil, border: string|table}
- ---@type fun(opts: DisplayOpenOpts)
+ ---@param opts WindowOpts
+ init = function(opts)
+ assert(renderer ~= nil, "No view function has been registered. Call .view() before .init().")
+ assert(unsubscribe ~= nil, "No state has been registered. Call .state() before .init().")
+ window_opts = opts
+ if opts.highlight_groups then
+ for hl_name, args in pairs(opts.highlight_groups) do
+ vim.api.nvim_set_hl(0, hl_name, args)
+ end
+ end
+ has_initiated = true
+ end,
+ ---@alias WindowOpenOpts { border: string | table }
+ ---@type fun(opts: WindowOpenOpts)
open = vim.schedule_wrap(function(opts)
log.trace "Opening window"
assert(has_initiated, "Display has not been initiated, cannot open.")
diff --git a/lua/nvim-lsp-installer/core/ui/init.lua b/lua/mason/core/ui/init.lua
index 5b855949..fcef0712 100644
--- a/lua/nvim-lsp-installer/core/ui/init.lua
+++ b/lua/mason/core/ui/init.lua
@@ -1,4 +1,4 @@
-local _ = require "nvim-lsp-installer.core.functional"
+local _ = require "mason.core.functional"
local M = {}
---@alias NodeType
@@ -8,8 +8,9 @@ local M = {}
---| '"DIAGNOSTICS"'
---| '"HL_TEXT"'
---| '"KEYBIND_HANDLER"'
+---| '"STICKY_CURSOR"'
----@alias INode Node | HlTextNode | CascadingStyleNode | VirtualTextNode | KeybindHandlerNode | DiagnosticsNode
+---@alias INode Node | HlTextNode | CascadingStyleNode | VirtualTextNode | KeybindHandlerNode | DiagnosticsNode | StickyCursorNode
---@param children INode[]
function M.Node(children)
@@ -97,7 +98,7 @@ end
---@param key string @The keymap to register to. Example: "<CR>".
---@param effect string @The effect to call when keymap is triggered by the user.
---@param payload any @The payload to pass to the effect handler when triggered.
----@param is_global boolean @Whether to register the keybind to apply on all lines in the buffer.
+---@param is_global boolean|nil @Whether to register the keybind to apply on all lines in the buffer.
function M.Keybind(key, effect, payload, is_global)
---@class KeybindHandlerNode
local node = {
@@ -138,4 +139,65 @@ function M.Table(rows)
return M.HlTextNode(rows)
end
+---@param opts { id: string }
+function M.StickyCursor(opts)
+ ---@class StickyCursorNode
+ local node = {
+ type = "STICKY_CURSOR",
+ id = opts.id,
+ }
+ return node
+end
+
+---Makes it possible to create stateful animations by progressing from the start of a range to the end.
+---This is done in "ticks", in accordance with the provided options.
+---@param opts {range: integer[], delay_ms: integer, start_delay_ms: integer, iteration_delay_ms: integer}
+function M.animation(opts)
+ local animation_fn = opts[1]
+ local start_tick, end_tick = opts.range[1], opts.range[2]
+ local is_animating = false
+
+ local function start_animation()
+ if is_animating then
+ return
+ end
+ local tick, start
+
+ tick = function(current_tick)
+ animation_fn(current_tick)
+ if current_tick < end_tick then
+ vim.defer_fn(function()
+ tick(current_tick + 1)
+ end, opts.delay_ms)
+ else
+ is_animating = false
+ if opts.iteration_delay_ms then
+ start(opts.iteration_delay_ms)
+ end
+ end
+ end
+
+ start = function(delay_ms)
+ is_animating = true
+ if delay_ms then
+ vim.defer_fn(function()
+ tick(start_tick)
+ end, delay_ms)
+ else
+ tick(start_tick)
+ end
+ end
+
+ start(opts.start_delay_ms)
+
+ local function cancel()
+ is_animating = false
+ end
+
+ return cancel
+ end
+
+ return start_animation
+end
+
return M
diff --git a/lua/nvim-lsp-installer/core/ui/state.lua b/lua/mason/core/ui/state.lua
index 9d7bcdda..9d7bcdda 100644
--- a/lua/nvim-lsp-installer/core/ui/state.lua
+++ b/lua/mason/core/ui/state.lua
diff --git a/lua/nvim-lsp-installer/health/init.lua b/lua/mason/health/init.lua
index 909c91cb..510b099a 100644
--- a/lua/nvim-lsp-installer/health/init.lua
+++ b/lua/mason/health/init.lua
@@ -1,11 +1,9 @@
local health = vim.health or require "health"
-local a = require "nvim-lsp-installer.core.async"
-local platform = require "nvim-lsp-installer.core.platform"
-local github_client = require "nvim-lsp-installer.core.managers.github.client"
-local _ = require "nvim-lsp-installer.core.functional"
-local spawn = require "nvim-lsp-installer.core.spawn"
-
-local when = _.when
+local a = require "mason.core.async"
+local platform = require "mason.core.platform"
+local github_client = require "mason.core.managers.github.client"
+local _ = require "mason.core.functional"
+local spawn = require "mason.core.spawn"
local M = {}
@@ -41,7 +39,7 @@ function HealthCheck:get_health_report_level()
return ({
["success"] = "report_ok",
["parse-error"] = "report_warn",
- ["version-mismatch"] = "report_error",
+ ["version-mismatch"] = self.relaxed and "report_warn" or "report_error",
["not-available"] = self.relaxed and "report_warn" or "report_error",
})[self.result]
end
@@ -119,7 +117,7 @@ local function mk_healthcheck(callback)
end
function M.check()
- health.report_start "nvim-lsp-installer report"
+ health.report_start "mason.nvim report"
if vim.fn.has "nvim-0.7.0" == 1 then
health.report_ok "neovim version >= 0.7.0"
else
@@ -136,7 +134,7 @@ function M.check()
end
))
- local checks = _.list_not_nil(
+ local checks = {
check {
cmd = "go",
args = { "version" },
@@ -151,7 +149,18 @@ function M.check()
end
end,
},
- check { cmd = "cargo", args = { "--version" }, name = "cargo", relaxed = true },
+ check {
+ cmd = "cargo",
+ args = { "--version" },
+ name = "cargo",
+ relaxed = true,
+ version_check = function(version)
+ local _, _, major, minor = version:find "(%d+)%.(%d+)%.(%d+)"
+ if (tonumber(major) <= 1) and (tonumber(minor) < 60) then
+ return "Some cargo installations require Rust >= 1.60.0."
+ end
+ end,
+ },
check {
cmd = "luarocks",
args = { "--version" },
@@ -194,28 +203,10 @@ function M.check()
end
end,
},
- when(
- platform.is_win,
- check { cmd = "python", use_stderr = true, args = { "--version" }, name = "python", relaxed = true }
- ),
- when(
- platform.is_win,
- check { cmd = "python", args = { "-m", "pip", "--version" }, name = "pip", relaxed = true }
- ),
check { cmd = "python3", args = { "--version" }, name = "python3", relaxed = true },
check { cmd = "python3", args = { "-m", "pip", "--version" }, name = "pip3", relaxed = true },
check { cmd = "javac", args = { "-version" }, name = "javac", relaxed = true },
check { cmd = "java", args = { "-version" }, name = "java", use_stderr = true, relaxed = true },
- when(
- vim.env.JAVA_HOME,
- check {
- cmd = ("%s/bin/java"):format(vim.env.JAVA_HOME),
- args = { "-version" },
- name = "JAVA_HOME",
- use_stderr = true,
- relaxed = true,
- }
- ),
check { cmd = "julia", args = { "--version" }, name = "julia", relaxed = true },
check { cmd = "wget", args = { "--version" }, name = "wget" },
-- wget is used interchangeably with curl, but with higher priority, so we mark curl as relaxed
@@ -227,15 +218,45 @@ function M.check()
use_stderr = platform.is_mac, -- Apple gzip prints version string to stderr
},
check { cmd = "tar", args = { "--version" }, name = "tar" },
- when(
- vim.g.python3_host_prog,
- check { cmd = vim.g.python3_host_prog, args = { "--version" }, name = "python3_host_prog", relaxed = true }
- ),
- when(platform.is_unix, check { cmd = "bash", args = { "--version" }, name = "bash" }),
- when(platform.is_unix, check { cmd = "sh", name = "sh" })
-- when(platform.is_win, check { cmd = "powershell.exe", args = { "-Version" }, name = "PowerShell" }), -- TODO fix me
-- when(platform.is_win, check { cmd = "cmd.exe", args = { "-Version" }, name = "cmd" }) -- TODO fix me
- )
+ }
+
+ if platform.is.unix then
+ table.insert(checks, check { cmd = "bash", args = { "--version" }, name = "bash" })
+ table.insert(checks, check { cmd = "sh", name = "sh" })
+ end
+
+ if platform.is.win then
+ table.insert(
+ checks,
+ check { cmd = "python", use_stderr = true, args = { "--version" }, name = "python", relaxed = true }
+ )
+ table.insert(
+ checks,
+ check { cmd = "python", args = { "-m", "pip", "--version" }, name = "pip", relaxed = true }
+ )
+ end
+
+ if vim.g.python3_host_prog then
+ table.insert(
+ checks,
+ check { cmd = vim.g.python3_host_prog, args = { "--version" }, name = "python3_host_prog", relaxed = true }
+ )
+ end
+
+ if vim.env.JAVA_HOME then
+ table.insert(
+ checks,
+ check {
+ cmd = ("%s/bin/java"):format(vim.env.JAVA_HOME),
+ args = { "-version" },
+ name = "JAVA_HOME",
+ use_stderr = true,
+ relaxed = true,
+ }
+ )
+ end
a.run_blocking(function()
for _, c in ipairs(checks) do
diff --git a/lua/nvim-lsp-installer/log.lua b/lua/mason/log.lua
index b1a6e18d..a5b7009c 100644
--- a/lua/nvim-lsp-installer/log.lua
+++ b/lua/mason/log.lua
@@ -1,11 +1,11 @@
-local functional = require "nvim-lsp-installer.core.functional"
-local path = require "nvim-lsp-installer.core.path"
-local settings = require "nvim-lsp-installer.settings"
-local platform = require "nvim-lsp-installer.core.platform"
+local _ = require "mason.core.functional"
+local path = require "mason.core.path"
+local settings = require "mason.settings"
+local platform = require "mason.core.platform"
local config = {
-- Name of the plugin. Prepended to log messages
- name = "lsp-installer",
+ name = "mason",
-- Should print the output to neovim while running
-- values: 'sync','async',false
@@ -32,7 +32,7 @@ local config = {
local log = {
outfile = path.concat {
- vim.fn.stdpath "cache",
+ vim.fn.stdpath "log",
("%s.log"):format(config.name),
},
}
@@ -46,6 +46,11 @@ do
return (x > 0 and math.floor(x + 0.5) or math.ceil(x - 0.5)) * increment
end
+ local tbl_has_tostring = function(tbl)
+ local mt = getmetatable(tbl)
+ return mt and mt.__tostring ~= nil
+ end
+
local make_string = function(...)
local t = {}
for i = 1, select("#", ...) do
@@ -53,7 +58,7 @@ do
if type(x) == "number" and config.float_precision then
x = tostring(round(x, config.float_precision))
- elseif type(x) == "table" then
+ elseif type(x) == "table" and not tbl_has_tostring(x) then
x = vim.inspect(x)
else
x = tostring(x)
@@ -114,7 +119,7 @@ do
end
end
- for _, x in ipairs(config.modes) do
+ for __, x in ipairs(config.modes) do
-- log.info("these", "are", "separated")
log[x.name] = function(...)
return log_at_level(x, make_string, ...)
@@ -127,7 +132,11 @@ do
local fmt = table.remove(passed, 1)
local inspected = {}
for _, v in ipairs(passed) do
- table.insert(inspected, vim.inspect(v))
+ if type(v) == "table" and tbl_has_tostring(v) then
+ table.insert(inspected, v)
+ else
+ table.insert(inspected, vim.inspect(v))
+ end
end
return string.format(fmt, unpack(inspected))
end, ...)
@@ -136,11 +145,15 @@ do
-- log.lazy_info(expensive_to_calculate)
log[("lazy_%s"):format(x.name)] = function(f)
return log_at_level(x, function()
- local passed = functional.table_pack(f())
+ local passed = _.table_pack(f())
local fmt = table.remove(passed, 1)
local inspected = {}
for _, v in ipairs(passed) do
- table.insert(inspected, vim.inspect(v))
+ if type(v) == "table" and tbl_has_tostring(v) then
+ table.insert(inspected, v)
+ else
+ table.insert(inspected, vim.inspect(v))
+ end
end
return string.format(fmt, unpack(inspected))
end)
diff --git a/lua/nvim-lsp-installer/notify.lua b/lua/mason/notify.lua
index 4569527e..b41c7e64 100644
--- a/lua/nvim-lsp-installer/notify.lua
+++ b/lua/mason/notify.lua
@@ -1,4 +1,4 @@
-local TITLE = "nvim-lsp-installer"
+local TITLE = "mason.nvim"
return function(msg, level)
local has_notify_plugin = pcall(require, "notify")
diff --git a/lua/mason/packages/angular-language-server/init.lua b/lua/mason/packages/angular-language-server/init.lua
new file mode 100644
index 00000000..6a7e42fc
--- /dev/null
+++ b/lua/mason/packages/angular-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "angular-language-server",
+ desc = [[The Angular Language Service provides code editors with a way to get completions, errors, hints, and navigation inside Angular templates. It works with external templates in separate HTML files, and also with in-line templates.]],
+ homepage = "https://angular.io/guide/language-service",
+ languages = { Pkg.Lang.Angular },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@angular/language-server", "typescript", bin = { "ngserver" } },
+}
diff --git a/lua/mason/packages/ansible-language-server/init.lua b/lua/mason/packages/ansible-language-server/init.lua
new file mode 100644
index 00000000..dc894134
--- /dev/null
+++ b/lua/mason/packages/ansible-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "ansible-language-server",
+ desc = [[Ansible Language Server]],
+ homepage = "https://github.com/ansible/ansible-language-server",
+ languages = { Pkg.Lang.Ansible },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@ansible/ansible-language-server", bin = { "ansible-language-server"} },
+}
diff --git a/lua/mason/packages/apex-language-server/init.lua b/lua/mason/packages/apex-language-server/init.lua
new file mode 100644
index 00000000..bf3bf3e9
--- /dev/null
+++ b/lua/mason/packages/apex-language-server/init.lua
@@ -0,0 +1,38 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local github_client = require "mason.core.managers.github.client"
+local Optional = require "mason.core.optional"
+local path = require "mason.core.path"
+local _ = require "mason.core.functional"
+
+local JAR_FILE = "apex-jorje-lsp.jar"
+return Pkg.new {
+ name = "apex-language-server",
+ desc = [[The Apex Language Server is an IDE-agnostic way for tools to access code-editing capabilities such as code completion, go to definition, find all usage, and refactoring.]],
+ homepage = "https://github.com/forcedotcom/salesforcedx-vscode",
+ languages = { Pkg.Lang.Apex },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "forcedotcom/salesforcedx-vscode"
+
+ -- See https://github.com/forcedotcom/salesforcedx-vscode/issues/4184#issuecomment-1146052086
+ ---@type GitHubRelease
+ local release = github_client
+ .fetch_releases(repo)
+ :map(_.find_first(_.prop_satisfies(_.compose(_.gt(0), _.length), "assets")))
+ :map(Optional.of_nilable)
+ :get_or_throw() -- Result unwrap
+ :or_else_throw "Failed to find release with assets." -- Optional unwrap
+
+ github.unzip_release_file({
+ version = Optional.of(release.tag_name),
+ asset_file = _.compose(_.format "salesforcedx-vscode-apex-%s.vsix", _.gsub("^v", "")),
+ repo = repo,
+ }).with_receipt()
+
+ ctx.fs:rename(path.concat { "extension", "out", JAR_FILE }, JAR_FILE)
+ ctx.fs:rmrf "extension"
+ end,
+}
diff --git a/lua/mason/packages/arduino-language-server/init.lua b/lua/mason/packages/arduino-language-server/init.lua
new file mode 100644
index 00000000..7801ae79
--- /dev/null
+++ b/lua/mason/packages/arduino-language-server/init.lua
@@ -0,0 +1,44 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "arduino-language-server",
+ desc = [[An Arduino Language Server based on Clangd to Arduino code autocompletion]],
+ homepage = "https://github.com/arduino/arduino-language-server",
+ languages = { Pkg.Lang.Arduino },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local opts = {
+ repo = "arduino/arduino-language-server",
+ asset_file = function(release)
+ local target = coalesce(
+ when(platform.is.mac, "arduino-language-server_%s_macOS_64bit.tar.gz"),
+ when(platform.is.linux_x64, "arduino-language-server_%s_Linux_64bit.tar.gz"),
+ when(platform.is.linux_x86, "arduino-language-server_%s_Linux_32bit.tar.gz"),
+ when(platform.is.linux_arm64, "arduino-language-server_%s_Linux_ARM64.tar.gz"),
+ when(platform.is.win_x64, "arduino-language-server_0.6.0_Windows_64bit.zip"),
+ when(platform.is.win_x86, "arduino-language-server_0.6.0_Windows_32bit.zip")
+ )
+
+ return target and target:format(release)
+ end,
+ }
+
+ platform.when {
+ unix = function()
+ github.untargz_release_file(opts).with_receipt()
+ ctx:link_bin("arduino-language-server", "arduino-language-server")
+ end,
+ win = function()
+ github.unzip_release_file(opts).with_receipt()
+ ctx:link_bin("arduino-language-server", "arduino-language-server.exe")
+ end,
+ }
+ end,
+}
diff --git a/lua/mason/packages/asm-lsp/init.lua b/lua/mason/packages/asm-lsp/init.lua
new file mode 100644
index 00000000..f28afba9
--- /dev/null
+++ b/lua/mason/packages/asm-lsp/init.lua
@@ -0,0 +1,13 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "asm-lsp",
+ desc = [[Language server for NASM/GAS/GO Assembly]],
+ homepage = "https://github.com/bergercookie/asm-lsp",
+ languages = { Pkg.Lang.Assembly },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("asm-lsp", {
+ bin = { "asm-lsp" },
+ }),
+}
diff --git a/lua/mason/packages/astro-language-server/init.lua b/lua/mason/packages/astro-language-server/init.lua
new file mode 100644
index 00000000..03a4cb79
--- /dev/null
+++ b/lua/mason/packages/astro-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "astro-language-server",
+ desc = [[The Astro language server, its structure is inspired by the Svelte Language Server.]],
+ homepage = "https://github.com/withastro/language-tools",
+ languages = { Pkg.Lang.Astro },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@astrojs/language-server", bin = { "astro-ls" } },
+}
diff --git a/lua/mason/packages/awk-language-server/init.lua b/lua/mason/packages/awk-language-server/init.lua
new file mode 100644
index 00000000..39f9cc54
--- /dev/null
+++ b/lua/mason/packages/awk-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "awk-language-server",
+ desc = [[Language Server for AWK]],
+ homepage = "https://github.com/Beaglefoot/awk-language-server",
+ languages = { Pkg.Lang.AWK },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "awk-language-server", bin = { "awk-language-server" } },
+}
diff --git a/lua/mason/packages/bash-language-server/init.lua b/lua/mason/packages/bash-language-server/init.lua
new file mode 100644
index 00000000..eb5fb68d
--- /dev/null
+++ b/lua/mason/packages/bash-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "bash-language-server",
+ desc = [[A language server for Bash]],
+ homepage = "https://github.com/bash-lsp/bash-language-server",
+ languages = { Pkg.Lang.Bash },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "bash-language-server", bin = { "bash-language-server" } },
+}
diff --git a/lua/mason/packages/beancount-language-server/init.lua b/lua/mason/packages/beancount-language-server/init.lua
new file mode 100644
index 00000000..579f5777
--- /dev/null
+++ b/lua/mason/packages/beancount-language-server/init.lua
@@ -0,0 +1,13 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "beancount-language-server",
+ desc = [[A Language Server Protocol (LSP) for beancount files]],
+ homepage = "https://github.com/polarmutex/beancount-language-server",
+ languages = { Pkg.Lang.Beancount },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("beancount-language-server", {
+ bin = { "beancount-language-server" },
+ }),
+}
diff --git a/lua/mason/packages/bicep-lsp/init.lua b/lua/mason/packages/bicep-lsp/init.lua
new file mode 100644
index 00000000..81e814d6
--- /dev/null
+++ b/lua/mason/packages/bicep-lsp/init.lua
@@ -0,0 +1,29 @@
+local Pkg = require "mason.core.package"
+local path = require "mason.core.path"
+local std = require "mason.core.managers.std"
+local github = require "mason.core.managers.github"
+
+return Pkg.new {
+ name = "bicep-lsp",
+ desc = [[Bicep is a declarative language for describing and deploying Azure resources]],
+ homepage = "https://github.com/Azure/bicep",
+ languages = { Pkg.Lang.Bicep },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ std.ensure_executable("dotnet", { help_url = "https://dotnet.microsoft.com/download" })
+ ctx.fs:mkdir "vscode"
+ ctx:chdir("vscode", function()
+ -- The bicep-langserver.zip is a bit broken on POSIX systems - so we download it via the VSCode distribution
+ -- instead. See https://github.com/Azure/bicep/issues/3704.
+ github.unzip_release_file({
+ repo = "Azure/bicep",
+ asset_file = "vscode-bicep.vsix",
+ }).with_receipt()
+ end)
+ ctx.fs:rename(path.concat { "vscode", "extension", "bicepLanguageServer" }, "langserver")
+ ctx.fs:rmrf "vscode"
+ ctx:chdir "langserver"
+ end,
+}
diff --git a/lua/mason/packages/bsl-language-server/init.lua b/lua/mason/packages/bsl-language-server/init.lua
new file mode 100644
index 00000000..28a3e753
--- /dev/null
+++ b/lua/mason/packages/bsl-language-server/init.lua
@@ -0,0 +1,21 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+
+return Pkg.new {
+ name = "bsl-language-server",
+ desc = [[Implementation of Language Server Protocol for Language 1C (BSL)]],
+ homepage = "https://1c-syntax.github.io/bsl-language-server",
+ languages = { Pkg.Lang["1С:Enterprise"], Pkg.Lang.OneScript },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ install = function()
+ github.download_release_file({
+ repo = "1c-syntax/bsl-language-server",
+ out_file = "bsl-lsp.jar",
+ asset_file = function(release)
+ local version = release:gsub("^v", "")
+ return ("bsl-language-server-%s-exec.jar"):format(version)
+ end,
+ }).with_receipt()
+ end,
+}
diff --git a/lua/nvim-lsp-installer/servers/ccls/common.lua b/lua/mason/packages/ccls/common.lua
index 666a2a6a..3226f397 100644
--- a/lua/nvim-lsp-installer/servers/ccls/common.lua
+++ b/lua/mason/packages/ccls/common.lua
@@ -1,19 +1,23 @@
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local installer = require "nvim-lsp-installer.core.installer"
-local git = require "nvim-lsp-installer.core.managers.git"
-local Optional = require "nvim-lsp-installer.core.optional"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local installer = require "mason.core.installer"
+local git = require "mason.core.managers.git"
+local github = require "mason.core.managers.github"
+local Optional = require "mason.core.optional"
---@async
---@param opts {llvm_dir: string}
return function(opts)
local ctx = installer.context()
- local clang_resource_dir = path.concat { ctx.destination_dir, "clang-resource" }
+ local clang_resource_dir = path.concat { ctx.package:get_install_path(), "clang-resource" }
local install_prefix = ctx.cwd:get()
+ local source = github.tag { repo = "MaskRay/ccls" }
+ source.with_receipt()
+
ctx.fs:mkdir "ccls-git"
ctx:chdir("ccls-git", function()
- git.clone { "https://github.com/MaskRay/ccls", recursive = true }
+ git.clone { "https://github.com/MaskRay/ccls", recursive = true, version = Optional.of(source.tag) }
ctx.spawn.cmake {
"-DCMAKE_BUILD_TYPE=Release",
"-DUSE_SYSTEM_RAPIDJSON=OFF",
@@ -38,4 +42,6 @@ return function(opts)
ctx.spawn.make { "install" }
end)
ctx.fs:rmrf "ccls-git"
+
+ ctx:link_bin("ccls", path.concat { "bin", "ccls" })
end
diff --git a/lua/mason/packages/ccls/init.lua b/lua/mason/packages/ccls/init.lua
new file mode 100644
index 00000000..2d42f25d
--- /dev/null
+++ b/lua/mason/packages/ccls/init.lua
@@ -0,0 +1,17 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+
+return Pkg.new {
+ name = "ccls",
+ desc = [[C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting]],
+ homepage = "https://github.com/MaskRay/ccls",
+ languages = { Pkg.Lang.C, Pkg.Lang["C++"], Pkg.Lang["Obective-C"] },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ install = function()
+ platform.when {
+ mac = require "mason.packages.ccls.mac",
+ linux = require "mason.packages.ccls.linux",
+ }
+ end,
+}
diff --git a/lua/nvim-lsp-installer/servers/ccls/linux.lua b/lua/mason/packages/ccls/linux.lua
index 44bd29ca..96a1859b 100644
--- a/lua/nvim-lsp-installer/servers/ccls/linux.lua
+++ b/lua/mason/packages/ccls/linux.lua
@@ -1,14 +1,14 @@
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local installer = require "nvim-lsp-installer.core.installer"
-local github = require "nvim-lsp-installer.core.managers.github"
-local functional = require "nvim-lsp-installer.core.functional"
-local Result = require "nvim-lsp-installer.core.result"
-local Optional = require "nvim-lsp-installer.core.optional"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local installer = require "mason.core.installer"
+local github = require "mason.core.managers.github"
+local _ = require "mason.core.functional"
+local Result = require "mason.core.result"
+local Optional = require "mason.core.optional"
-local ccls_installer = require "nvim-lsp-installer.servers.ccls.common"
+local ccls_installer = require "mason.packages.ccls.common"
-local coalesce, when = functional.coalesce, functional.when
+local coalesce, when = _.coalesce, _.when
---@param release string
local function normalize_llvm_release(release)
diff --git a/lua/nvim-lsp-installer/servers/ccls/mac.lua b/lua/mason/packages/ccls/mac.lua
index b9b482b7..907bd548 100644
--- a/lua/nvim-lsp-installer/servers/ccls/mac.lua
+++ b/lua/mason/packages/ccls/mac.lua
@@ -1,9 +1,9 @@
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local installer = require "nvim-lsp-installer.core.installer"
-local fs = require "nvim-lsp-installer.core.fs"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local installer = require "mason.core.installer"
+local fs = require "mason.core.fs"
-local ccls_installer = require "nvim-lsp-installer.servers.ccls.common"
+local ccls_installer = require "mason.packages.ccls.common"
---@async
return function()
diff --git a/lua/mason/packages/clangd/init.lua b/lua/mason/packages/clangd/init.lua
new file mode 100644
index 00000000..6f5657b1
--- /dev/null
+++ b/lua/mason/packages/clangd/init.lua
@@ -0,0 +1,40 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+local path = require "mason.core.path"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "clangd",
+ desc = [[clangd understands your C++ code and adds smart features to your editor: code completion, compile errors, go-to-definition and more.]],
+ homepage = "https://clangd.llvm.org",
+ languages = { Pkg.Lang.C, Pkg.Lang["C++"] },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local source = github.unzip_release_file {
+ repo = "clangd/clangd",
+ asset_file = function(release)
+ local target = coalesce(
+ when(platform.is.mac, "clangd-mac-%s.zip"),
+ when(platform.is.linux_x64, "clangd-linux-%s.zip"),
+ when(platform.is.win_x64, "clangd-windows-%s.zip")
+ )
+ return target and target:format(release)
+ end,
+ }
+ source.with_receipt()
+ ctx.fs:rename(("clangd_%s"):format(source.release), "clangd")
+ ctx:link_bin(
+ "clangd",
+ path.concat {
+ "clangd",
+ "bin",
+ platform.is.win and "clangd.exe" or "clangd",
+ }
+ )
+ end,
+}
diff --git a/lua/mason/packages/clarity-lsp/init.lua b/lua/mason/packages/clarity-lsp/init.lua
new file mode 100644
index 00000000..060d18fa
--- /dev/null
+++ b/lua/mason/packages/clarity-lsp/init.lua
@@ -0,0 +1,27 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+local _ = require "mason.core.functional"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "clarity-lsp",
+ desc = [[Language Server Protocol implementation for Clarity.]],
+ homepage = "https://github.com/hirosystems/clarity-lsp",
+ languages = { Pkg.Lang.Clarity },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "hirosystems/clarity-lsp",
+ asset_file = coalesce(
+ when(platform.is.mac, "clarity-lsp-macos-x64.zip"),
+ when(platform.is.linux_x64, "clarity-lsp-linux-x64.zip"),
+ when(platform.is.win_x64, "clarity-lsp-windows-x64.zip")
+ ),
+ }).with_receipt()
+ ctx:link_bin("clarity-lsp", platform.is.win and "clarity-lsp.exe" or "clarity-lsp")
+ end,
+}
diff --git a/lua/mason/packages/clojure-lsp/init.lua b/lua/mason/packages/clojure-lsp/init.lua
new file mode 100644
index 00000000..127fa80e
--- /dev/null
+++ b/lua/mason/packages/clojure-lsp/init.lua
@@ -0,0 +1,31 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "clojure-lsp",
+ desc = [[A Language Server for Clojure(script). Taking a Cursive-like approach of statically analyzing code.]],
+ homepage = "https://clojure-lsp.io",
+ languages = { Pkg.Lang.Clojure, Pkg.Lang.ClojureScript },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "clojure-lsp/clojure-lsp",
+ asset_file = coalesce(
+ when(platform.is.mac_arm64, "clojure-lsp-native-macos-aarch64.zip"),
+ when(platform.is.mac_x64, "clojure-lsp-native-macos-amd64.zip"),
+ when(platform.is.linux_x64, "clojure-lsp-native-linux-amd64.zip"),
+ when(platform.is.linux_arm64, "clojure-lsp-native-linux-aarch64.zip"),
+ when(platform.is_win, "clojure-lsp-native-windows-amd64.zip")
+ ),
+ }).with_receipt()
+ std.chmod("+x", { "clojure-lsp" })
+ ctx:link_bin("clojure-lsp", platform.is.win and "clojure-lsp.exe" or "clojure-lsp")
+ end,
+}
diff --git a/lua/mason/packages/cmake-language-server/init.lua b/lua/mason/packages/cmake-language-server/init.lua
new file mode 100644
index 00000000..9c5089ad
--- /dev/null
+++ b/lua/mason/packages/cmake-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "cmake-language-server",
+ desc = [[CMake LSP Implementation]],
+ homepage = "https://github.com/regen100/cmake-language-server",
+ languages = { Pkg.Lang.CMake },
+ categories = { Pkg.Cat.LSP },
+ install = pip3.packages { "cmake-language-server", bin = { "cmake-language-server" } },
+}
diff --git a/lua/mason/packages/codelldb/init.lua b/lua/mason/packages/codelldb/init.lua
new file mode 100644
index 00000000..9949d95f
--- /dev/null
+++ b/lua/mason/packages/codelldb/init.lua
@@ -0,0 +1,32 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local path = require "mason.core.path"
+
+return Pkg.new {
+ name = "codelldb",
+ desc = [[Official repository for the Microsoft C/C++ extension for VS Code.]],
+ homepage = "https://github.com/microsoft/vscode-cpptools",
+ languages = { Pkg.Lang.C, Pkg.Lang["C++"], Pkg.Lang.Rust },
+ categories = { Pkg.Cat.DAP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "vadimcn/vscode-lldb",
+ asset_file = _.coalesce(
+ _.when(platform.is.mac_x64, "codelldb-x86_64-darwin.vsix"),
+ _.when(platform.is.mac_arm64, "codelldb-aarch64-darwin.vsix"),
+ _.when(platform.is.linux_x64, "codelldb-x86_64-linux.vsix"),
+ _.when(platform.is.linux_arm64, "codelldb-aarch64-linux.vsix"),
+ _.when(platform.is.linux_arm, "codelldb-arm-linux.vsix"),
+ _.when(platform.is.win_x64, "codelldb-x86_64-windows.vsix")
+ ),
+ }).with_receipt()
+ ctx:link_bin(
+ "codelldb",
+ path.concat { "extension", "adapter", platform.is.win and "codelldb.exe" or "codelldb" }
+ )
+ end,
+}
diff --git a/lua/mason/packages/codeql/init.lua b/lua/mason/packages/codeql/init.lua
new file mode 100644
index 00000000..fd27f938
--- /dev/null
+++ b/lua/mason/packages/codeql/init.lua
@@ -0,0 +1,28 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+local path = require "mason.core.path"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "codeql",
+ desc = [[Discover vulnerabilities across a codebase with CodeQL, our industry-leading semantic code analysis engine. CodeQL lets you query code as though it were data. Write a query to find all variants of a vulnerability, eradicating it forever. Then share your query to help others do the same.]],
+ homepage = "https://github.com/github/codeql-cli-binaries",
+ languages = { Pkg.Lang.CodeQL },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "github/codeql-cli-binaries",
+ asset_file = coalesce(
+ when(platform.is.mac, "codeql-osx64.zip"),
+ when(platform.is.linux_x64, "codeql-linux64.zip"),
+ when(platform.is.win_x64, "codeql-win64.zip")
+ ),
+ }).with_receipt()
+ ctx:link_bin("codeql", path.concat { "codeql", platform.is.win and "codeql.cmd" or "codeql" })
+ end,
+}
diff --git a/lua/mason/packages/cpptools/init.lua b/lua/mason/packages/cpptools/init.lua
new file mode 100644
index 00000000..944bf2d2
--- /dev/null
+++ b/lua/mason/packages/cpptools/init.lua
@@ -0,0 +1,40 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local path = require "mason.core.path"
+
+return Pkg.new {
+ name = "cpptools",
+ desc = [[Official repository for the Microsoft C/C++ extension for VS Code.]],
+ homepage = "https://github.com/microsoft/vscode-cpptools",
+ languages = { Pkg.Lang.C, Pkg.Lang["C++"], Pkg.Lang.Rust },
+ categories = { Pkg.Cat.DAP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "microsoft/vscode-cpptools",
+ asset_file = _.coalesce(
+ _.when(platform.is.mac_x64, "cpptools-osx.vsix"),
+ _.when(platform.is.mac_arm64, "cpptools-osx-arm64.vsix"),
+ _.when(platform.is.linux_x64, "cpptools-linux.vsix"),
+ _.when(platform.is.linux_arm64, "cpptools-linux-aarch64.vsix"),
+ _.when(platform.is.linux_arm, "cpptools-linux-armhf.vsix"),
+ _.when(platform.is.win_x64, "cpptools-win64.vsix"),
+ _.when(platform.is.win_arm64, "cpptools-win-arm64.vsix"),
+ _.when(platform.is.win_x86, "cpptools-win32.vsix")
+ ),
+ }).with_receipt()
+
+ local debug_executable = path.concat {
+ "extension",
+ "debugAdapters",
+ "bin",
+ platform.is.win and "OpenDebugAD7.exe" or "OpenDebugAD7",
+ }
+ std.chmod("+x", debug_executable)
+ ctx:link_bin("OpenDebugAD7", debug_executable)
+ end,
+}
diff --git a/lua/mason/packages/crystalline/init.lua b/lua/mason/packages/crystalline/init.lua
new file mode 100644
index 00000000..9881cd90
--- /dev/null
+++ b/lua/mason/packages/crystalline/init.lua
@@ -0,0 +1,29 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "crystalline",
+ desc = [[A Language Server Protocol implementation for Crystal. 🔮]],
+ homepage = "https://github.com/elbywan/crystalline",
+ languages = { Pkg.Lang.Crystal },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.gunzip_release_file({
+ repo = "elbywan/crystalline",
+ asset_file = coalesce(
+ when(platform.is.mac_x64, "crystalline_x86_64-apple-darwin.gz"),
+ when(platform.is.linux_x64, "crystalline_x86_64-unknown-linux-gnu.gz")
+ ),
+ out_file = "crystalline",
+ }).with_receipt()
+ std.chmod("+x", { "crystalline" })
+ ctx:link_bin("crystalline", "crystalline")
+ end,
+}
diff --git a/lua/mason/packages/csharp-language-server/init.lua b/lua/mason/packages/csharp-language-server/init.lua
new file mode 100644
index 00000000..1147cf28
--- /dev/null
+++ b/lua/mason/packages/csharp-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local dotnet = require "mason.core.managers.dotnet"
+
+return Pkg.new {
+ name = "csharp-language-server",
+ desc = [[Roslyn-based LSP language server for C#]],
+ homepage = "https://github.com/razzmatazz/csharp-language-server",
+ languages = { Pkg.Lang["C#"] },
+ categories = { Pkg.Cat.LSP },
+ install = dotnet.package("csharp-ls", { bin = { "csharp-ls" } }),
+}
diff --git a/lua/mason/packages/css-lsp/init.lua b/lua/mason/packages/css-lsp/init.lua
new file mode 100644
index 00000000..c1562aec
--- /dev/null
+++ b/lua/mason/packages/css-lsp/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "css-lsp",
+ desc = [[Language Server Protocol implementation for CSS, SCSS & LESS.]],
+ homepage = "https://github.com/microsoft/vscode-css-languageservice",
+ languages = { Pkg.Lang.CSS, Pkg.Lang.SCSS, Pkg.Lang.LESS },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "vscode-langservers-extracted", bin = { "vscode-css-language-server" } },
+}
diff --git a/lua/mason/packages/cssmodules-language-server/init.lua b/lua/mason/packages/cssmodules-language-server/init.lua
new file mode 100644
index 00000000..098a167f
--- /dev/null
+++ b/lua/mason/packages/cssmodules-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "cssmodules-language-server",
+ desc = [[autocompletion and go-to-defintion for cssmodules]],
+ homepage = "https://github.com/antonk52/cssmodules-language-server",
+ languages = { Pkg.Lang.CSS },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "cssmodules-language-server", bin = { "cssmodules-language-server" } },
+}
diff --git a/lua/mason/packages/cucumber-language-server/init.lua b/lua/mason/packages/cucumber-language-server/init.lua
new file mode 100644
index 00000000..7e6cd44c
--- /dev/null
+++ b/lua/mason/packages/cucumber-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "cucumber-language-server",
+ desc = [[Cucumber Language Server]],
+ homepage = "https://github.com/cucumber/language-server",
+ languages = { Pkg.Lang.Cucumber },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@cucumber/language-server", bin = { "cucumber-language-server" } },
+}
diff --git a/lua/mason/packages/debugpy/init.lua b/lua/mason/packages/debugpy/init.lua
new file mode 100644
index 00000000..79e71825
--- /dev/null
+++ b/lua/mason/packages/debugpy/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "debugpy",
+ desc = [[An implementation of the Debug Adapter Protocol for Python]],
+ homepage = "https://github.com/microsoft/debugpy",
+ languages = { Pkg.Lang.Python },
+ categories = { Pkg.Cat.DAP },
+ install = pip3.packages { "debugpy" },
+}
diff --git a/lua/mason/packages/deno/init.lua b/lua/mason/packages/deno/init.lua
new file mode 100644
index 00000000..19390dc5
--- /dev/null
+++ b/lua/mason/packages/deno/init.lua
@@ -0,0 +1,28 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "deno",
+ desc = [[Deno (/ˈdiːnoʊ/, pronounced dee-no) is a JavaScript, TypeScript, and WebAssembly runtime with secure defaults and a great developer experience.]],
+ homepage = "https://deno.land/manual/language_server/overview",
+ languages = { Pkg.Lang.JavaScript, Pkg.Lang.TypeScript },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.Runtime },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "denoland/deno",
+ asset_file = coalesce(
+ when(platform.is.mac_arm64, "deno-aarch64-apple-darwin.zip"),
+ when(platform.is.mac_x64, "deno-x86_64-apple-darwin.zip"),
+ when(platform.is.linux_x64, "deno-x86_64-unknown-linux-gnu.zip"),
+ when(platform.is.win_x64, "deno-x86_64-pc-windows-msvc.zip")
+ ),
+ }).with_receipt()
+ ctx:link_bin("deno", platform.is.win and "deno.exe" or "deno")
+ end,
+}
diff --git a/lua/mason/packages/dhall-lsp/init.lua b/lua/mason/packages/dhall-lsp/init.lua
new file mode 100644
index 00000000..d941caee
--- /dev/null
+++ b/lua/mason/packages/dhall-lsp/init.lua
@@ -0,0 +1,67 @@
+local Pkg = require "mason.core.package"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local std = require "mason.core.managers.std"
+local github_client = require "mason.core.managers.github.client"
+local Optional = require "mason.core.optional"
+
+return Pkg.new {
+ name = "dhall-lsp",
+ desc = [[LSP server implementation for Dhall.]],
+ homepage = "https://github.com/dhall-lang/dhall-haskell/tree/master/dhall-lsp-server",
+ languages = { Pkg.Lang.Dhall },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "dhall-lang/dhall-haskell"
+ ---@type GitHubRelease
+ local gh_release = ctx.requested_version
+ :map(function(version)
+ return github_client.fetch_release(repo, version)
+ end)
+ :or_else_get(function()
+ return github_client.fetch_latest_release(repo)
+ end)
+ :get_or_throw()
+
+ local asset_name_pattern = assert(
+ _.coalesce(
+ _.when(platform.is.mac, "dhall%-lsp%-server%-.+%-x86_64%-macos.tar.bz2"),
+ _.when(platform.is.linux_x64, "dhall%-lsp%-server%-.+%-x86_64%-linux.tar.bz2"),
+ _.when(platform.is.win_x64, "dhall%-lsp%-server%-.+%-x86_64%-windows.zip")
+ )
+ )
+ local dhall_lsp_server_asset = _.find_first(
+ _.prop_satisfies(_.matches(asset_name_pattern), "name"),
+ gh_release.assets
+ )
+ Optional.of_nilable(dhall_lsp_server_asset)
+ :if_present(
+ ---@param asset GitHubReleaseAsset
+ function(asset)
+ if platform.is.win then
+ std.download_file(asset.browser_download_url, "dhall-lsp-server.zip")
+ std.unzip("dhall-lsp-server.zip", ".")
+ else
+ std.download_file(asset.browser_download_url, "dhall-lsp-server.tar.bz2")
+ std.untar "dhall-lsp-server.tar.bz2"
+ std.chmod("+x", { path.concat { "bin", "dhall-lsp-server" } })
+ end
+ ctx.receipt:with_primary_source {
+ type = "github_release_file",
+ repo = repo,
+ file = asset.browser_download_url,
+ release = gh_release.tag_name,
+ }
+ end
+ )
+ :or_else_throw "Unable to find the dhall-lsp-server release asset in the GitHub release."
+
+ ctx:link_bin(
+ "dhall-lsp-server",
+ path.concat { "bin", platform.is.win and "dhall-lsp-server.exe" or "dhall-lsp-server" }
+ )
+ end,
+}
diff --git a/lua/mason/packages/diagnostic-languageserver/init.lua b/lua/mason/packages/diagnostic-languageserver/init.lua
new file mode 100644
index 00000000..af69a0a4
--- /dev/null
+++ b/lua/mason/packages/diagnostic-languageserver/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "diagnostic-languageserver",
+ desc = [[Diagnostic language server that integrates with linters.]],
+ homepage = "https://github.com/iamcco/diagnostic-languageserver",
+ languages = {},
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "diagnostic-languageserver", bin = { "diagnostic-languageserver" } },
+}
diff --git a/lua/mason/packages/dockerfile-language-server/init.lua b/lua/mason/packages/dockerfile-language-server/init.lua
new file mode 100644
index 00000000..b81b6197
--- /dev/null
+++ b/lua/mason/packages/dockerfile-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "dockerfile-language-server",
+ desc = [[A language server for Dockerfiles powered by Node.js, TypeScript, and VSCode technologies.]],
+ homepage = "https://github.com/rcjsuen/dockerfile-language-server-nodejs",
+ languages = { Pkg.Lang.Dockerfile },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "dockerfile-language-server-nodejs", bin = { "docker-langserver" } },
+}
diff --git a/lua/mason/packages/dot-language-server/init.lua b/lua/mason/packages/dot-language-server/init.lua
new file mode 100644
index 00000000..32520c85
--- /dev/null
+++ b/lua/mason/packages/dot-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "dot-language-server",
+ desc = [[A language server for the DOT language]],
+ homepage = "https://github.com/nikeee/dot-language-server",
+ languages = { Pkg.Lang.DOT },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "dot-language-server", bin = { "dot-language-server" } },
+}
diff --git a/lua/mason/packages/efm/init.lua b/lua/mason/packages/efm/init.lua
new file mode 100644
index 00000000..b91e375e
--- /dev/null
+++ b/lua/mason/packages/efm/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local go = require "mason.core.managers.go"
+
+return Pkg.new {
+ name = "efm",
+ desc = [[General purpose Language Server]],
+ homepage = "https://github.com/mattn/efm-langserver",
+ languages = {},
+ categories = { Pkg.Cat.LSP },
+ install = go.packages { "github.com/mattn/efm-langserver", bin = { "efm-langserver" } },
+}
diff --git a/lua/mason/packages/elixir-ls/init.lua b/lua/mason/packages/elixir-ls/init.lua
new file mode 100644
index 00000000..4027a3e8
--- /dev/null
+++ b/lua/mason/packages/elixir-ls/init.lua
@@ -0,0 +1,19 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+return Pkg.new {
+ name = "elixir-ls",
+ desc = [[A frontend-independent IDE "smartness" server for Elixir. Implements the "Language Server Protocol" standard and provides debugger support via the "Debug Adapter Protocol"]],
+ homepage = "https://github.com/elixir-lsp/elixir-ls",
+ languages = { Pkg.Lang.Elixir },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.DAP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "elixir-lsp/elixir-ls",
+ asset_file = "elixir-ls.zip",
+ }).with_receipt()
+ end,
+}
diff --git a/lua/mason/packages/elm-format/init.lua b/lua/mason/packages/elm-format/init.lua
new file mode 100644
index 00000000..e162ffdc
--- /dev/null
+++ b/lua/mason/packages/elm-format/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "elm-format",
+ desc = [[elm-format formats Elm source code according to a standard set of rules based on the official Elm Style Guide]],
+ homepage = "https://github.com/avh4/elm-format",
+ languages = { Pkg.Lang.Elm },
+ categories = { Pkg.Cat.Formatter },
+ install = npm.packages { "elm-format", bin = { "elm-format" } },
+}
diff --git a/lua/mason/packages/elm-language-server/init.lua b/lua/mason/packages/elm-language-server/init.lua
new file mode 100644
index 00000000..847bed49
--- /dev/null
+++ b/lua/mason/packages/elm-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "elm-language-server",
+ desc = [[Language server implementation for Elm]],
+ homepage = "https://github.com/elm-tooling/elm-language-server",
+ languages = { Pkg.Lang.Elm },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@elm-tooling/elm-language-server", bin = { "elm-language-server" } },
+}
diff --git a/lua/mason/packages/ember-language-server/init.lua b/lua/mason/packages/ember-language-server/init.lua
new file mode 100644
index 00000000..62bd701b
--- /dev/null
+++ b/lua/mason/packages/ember-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "ember-language-server",
+ desc = [[Language Server Protocol implementation for Ember.js and Glimmer projects]],
+ homepage = "https://github.com/lifeart/ember-language-server",
+ languages = { Pkg.Lang.Ember },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@lifeart/ember-language-server", bin = { "ember-language-server" } },
+}
diff --git a/lua/mason/packages/emmet-ls/init.lua b/lua/mason/packages/emmet-ls/init.lua
new file mode 100644
index 00000000..6f9e3058
--- /dev/null
+++ b/lua/mason/packages/emmet-ls/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "emmet-ls",
+ desc = [[Emmet support based on LSP.]],
+ homepage = "https://github.com/aca/emmet-ls",
+ languages = { Pkg.Lang.Emmet },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "emmet-ls", bin = { "emmet-ls" } },
+}
diff --git a/lua/mason/packages/erlang-ls/init.lua b/lua/mason/packages/erlang-ls/init.lua
new file mode 100644
index 00000000..a6a22e0f
--- /dev/null
+++ b/lua/mason/packages/erlang-ls/init.lua
@@ -0,0 +1,34 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local std = require "mason.core.managers.std"
+local git = require "mason.core.managers.git"
+local github = require "mason.core.managers.github"
+local Optional = require "mason.core.optional"
+local path = require "mason.core.path"
+
+local rebar3 = platform.is_win and "rebar3.cmd" or "rebar3"
+
+return Pkg.new {
+ name = "erlang-ls",
+ desc = [[Implementing features such as auto-complete or go-to-definition for a programming language is not trivial. Traditionally, this work had to be repeated for each development tool and it required a mix of expertise in both the targeted programming language and the programming language internally used by the development tool of choice.]],
+ languages = { Pkg.Lang.Erlang },
+ categories = { Pkg.Cat.LSP },
+ homepage = "https://erlang-ls.github.io/",
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ std.ensure_executable(rebar3, { help_url = "http://rebar3.org/docs/" })
+
+ local repo = "erlang-ls/erlang_ls"
+ local source = github.tag { repo = repo }
+ source.with_receipt()
+ git.clone { ("https://github.com/%s.git"):format(repo), version = Optional.of(source.tag) }
+
+ ctx.spawn[rebar3] { "escriptize" }
+ ctx.spawn[rebar3] { "as", "dap", "escriptize" }
+ ctx:link_bin(
+ "erlang_ls",
+ path.concat { "_build", "default", "bin", platform.is.win and "erlang_ls.bat" or "erlang_ls" }
+ )
+ end,
+}
diff --git a/lua/mason/packages/esbonio/init.lua b/lua/mason/packages/esbonio/init.lua
new file mode 100644
index 00000000..278f100a
--- /dev/null
+++ b/lua/mason/packages/esbonio/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "esbonio",
+ desc = [[A Language Server for Sphinx projects.]],
+ homepage = "https://pypi.org/project/esbonio/",
+ languages = { Pkg.Lang.Sphinx },
+ categories = { Pkg.Cat.LSP },
+ install = pip3.packages { "esbonio", bin = { "esbonio" } },
+}
diff --git a/lua/mason/packages/eslint-lsp/init.lua b/lua/mason/packages/eslint-lsp/init.lua
new file mode 100644
index 00000000..b1d22e84
--- /dev/null
+++ b/lua/mason/packages/eslint-lsp/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "eslint-lsp",
+ desc = [[Language Server Protocol implementation for ESLint. The server uses the ESLint library installed in the opened workspace folder. If the folder doesn't provide one the extension looks for a global install version.]],
+ homepage = "https://github.com/Microsoft/vscode-eslint",
+ languages = { Pkg.Lang.JavaScript, Pkg.Lang.TypeScript },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "vscode-langservers-extracted", bin = { "vscode-eslint-language-server" } },
+}
diff --git a/lua/mason/packages/flux-lsp/init.lua b/lua/mason/packages/flux-lsp/init.lua
new file mode 100644
index 00000000..fb757b47
--- /dev/null
+++ b/lua/mason/packages/flux-lsp/init.lua
@@ -0,0 +1,14 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "flux-lsp",
+ desc = [[Implementation of Language Server Protocol for the Flux language]],
+ homepage = "https://github.com/influxdata/flux-lsp",
+ languages = { Pkg.Lang.Flux },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("https://github.com/influxdata/flux-lsp", {
+ git = true,
+ bin = { "flux-lsp" },
+ }),
+}
diff --git a/lua/mason/packages/foam-language-server/init.lua b/lua/mason/packages/foam-language-server/init.lua
new file mode 100644
index 00000000..6ff1b44c
--- /dev/null
+++ b/lua/mason/packages/foam-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "foam-language-server",
+ desc = [[A language server for OpenFOAM case files]],
+ homepage = "https://github.com/FoamScience/foam-language-server",
+ languages = { Pkg.Lang.OpenFOAM },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "foam-language-server", bin = { "foam-ls" } },
+}
diff --git a/lua/mason/packages/fortls/init.lua b/lua/mason/packages/fortls/init.lua
new file mode 100644
index 00000000..befd8cd3
--- /dev/null
+++ b/lua/mason/packages/fortls/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "fortls",
+ desc = [[fortls - Fortran Language Server]],
+ homepage = "https://github.com/gnikit/fortls",
+ languages = { Pkg.Lang.Fortran },
+ categories = { Pkg.Cat.LSP },
+ install = pip3.packages { "fortls", bin = { "fortls" } },
+}
diff --git a/lua/mason/packages/fsautocomplete/init.lua b/lua/mason/packages/fsautocomplete/init.lua
new file mode 100644
index 00000000..824aef7a
--- /dev/null
+++ b/lua/mason/packages/fsautocomplete/init.lua
@@ -0,0 +1,13 @@
+local Pkg = require "mason.core.package"
+local dotnet = require "mason.core.managers.dotnet"
+
+return Pkg.new {
+ name = "fsautocomplete",
+ desc = [[F# language server using Language Server Protocol]],
+ languages = { Pkg.Lang["F#"] },
+ categories = { Pkg.Cat.LSP },
+ homepage = "https://github.com/fsharp/FsAutoComplete",
+ install = dotnet.package("fsautocomplete", {
+ bin = { "fsautocomplete" },
+ }),
+}
diff --git a/lua/mason/packages/golangci-lint-langserver/init.lua b/lua/mason/packages/golangci-lint-langserver/init.lua
new file mode 100644
index 00000000..94445679
--- /dev/null
+++ b/lua/mason/packages/golangci-lint-langserver/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local go = require "mason.core.managers.go"
+
+return Pkg.new {
+ name = "golangci-lint-langserver",
+ desc = [[golangci-lint language server]],
+ homepage = "https://github.com/nametake/golangci-lint-langserver",
+ languages = { Pkg.Lang.Go },
+ categories = { Pkg.Cat.LSP },
+ install = go.packages { "github.com/nametake/golangci-lint-langserver", bin = { "golangci-lint-langserver" } },
+}
diff --git a/lua/mason/packages/golangci-lint/init.lua b/lua/mason/packages/golangci-lint/init.lua
new file mode 100644
index 00000000..2948858d
--- /dev/null
+++ b/lua/mason/packages/golangci-lint/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local go = require "mason.core.managers.go"
+
+return Pkg.new {
+ name = "golangci-lint",
+ desc = [[golangci-lint is a fast Go linters runner. It runs linters in parallel, uses caching, supports yaml config, has integrations with all major IDE and has dozens of linters included.]],
+ homepage = "https://golangci-lint.run/",
+ languages = { Pkg.Lang.Go },
+ categories = { Pkg.Cat.Linter },
+ install = go.packages { "github.com/golangci/golangci-lint/cmd/golangci-lint", bin = { "golangci-lint" } },
+}
diff --git a/lua/mason/packages/gopls/init.lua b/lua/mason/packages/gopls/init.lua
new file mode 100644
index 00000000..39c4c74e
--- /dev/null
+++ b/lua/mason/packages/gopls/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local go = require "mason.core.managers.go"
+
+return Pkg.new {
+ name = "gopls",
+ desc = [[gopls (pronounced "Go please") is the official Go language server developed by the Go team. It provides IDE features to any LSP-compatible editor.]],
+ homepage = "https://pkg.go.dev/golang.org/x/tools/gopls",
+ languages = { Pkg.Lang.Go },
+ categories = { Pkg.Cat.LSP },
+ install = go.packages { "golang.org/x/tools/gopls", bin = { "gopls" } },
+}
diff --git a/lua/mason/packages/grammarly-languageserver/init.lua b/lua/mason/packages/grammarly-languageserver/init.lua
new file mode 100644
index 00000000..2135a330
--- /dev/null
+++ b/lua/mason/packages/grammarly-languageserver/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "grammarly-languageserver",
+ desc = [[A language server implementation on top of Grammarly's SDK.]],
+ homepage = "https://github.com/znck/grammarly",
+ languages = { Pkg.Lang.Markdown, Pkg.Lang.Text },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "grammarly-languageserver", bin = { "grammarly-languageserver" } },
+}
diff --git a/lua/mason/packages/graphql-language-service-cli/init.lua b/lua/mason/packages/graphql-language-service-cli/init.lua
new file mode 100644
index 00000000..d01fec0c
--- /dev/null
+++ b/lua/mason/packages/graphql-language-service-cli/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "graphql-language-service-cli",
+ desc = [[GraphQL Language Service provides an interface for building GraphQL language services for IDEs.]],
+ homepage = "https://www.npmjs.com/package/graphql-language-service-cli",
+ languages = { Pkg.Lang.GraphQL },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "graphql-language-service-cli", "graphql", bin = { "graphql-lsp" } },
+}
diff --git a/lua/mason/packages/groovy-language-server/init.lua b/lua/mason/packages/groovy-language-server/init.lua
new file mode 100644
index 00000000..d6dc84d2
--- /dev/null
+++ b/lua/mason/packages/groovy-language-server/init.lua
@@ -0,0 +1,22 @@
+local Pkg = require "mason.core.package"
+local std = require "mason.core.managers.std"
+local git = require "mason.core.managers.git"
+
+return Pkg.new {
+ name = "groovy-language-server",
+ desc = [[A language server for Groovy]],
+ homepage = "https://github.com/GroovyLanguageServer/groovy-language-server",
+ languages = { Pkg.Lang.Groovy },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ std.ensure_executable "javac"
+ git.clone({ "https://github.com/GroovyLanguageServer/groovy-language-server" }).with_receipt()
+ ctx:promote_cwd()
+ ctx.spawn.gradlew {
+ "build",
+ with_paths = { ctx.cwd:get() },
+ }
+ end,
+}
diff --git a/lua/mason/packages/haskell-language-server/init.lua b/lua/mason/packages/haskell-language-server/init.lua
new file mode 100644
index 00000000..a3560556
--- /dev/null
+++ b/lua/mason/packages/haskell-language-server/init.lua
@@ -0,0 +1,65 @@
+local a = require "mason.core.async"
+local _ = require "mason.core.functional"
+local Pkg = require "mason.core.package"
+local std = require "mason.core.managers.std"
+local github_client = require "mason.core.managers.github.client"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+
+return Pkg.new {
+ name = "haskell-language-server",
+ desc = [[Official Haskell Language Server implementation.]],
+ homepage = "https://haskell-language-server.readthedocs.io/en/latest/",
+ languages = { Pkg.Lang.Haskell },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "haskell/haskell-language-server"
+ local release = ctx.requested_version:or_else_get(function()
+ return github_client.fetch_latest_release(repo)
+ :map(
+ ---@param release GitHubRelease
+ function(release)
+ return release.tag_name
+ end
+ )
+ :get_or_throw()
+ end)
+
+ std.ensure_executable("ghcup", { help_url = "https://www.haskell.org/ghcup/" })
+ ctx:promote_cwd()
+ ctx.spawn.ghcup { "install", "hls", release, "-i", ctx.cwd:get() }
+
+ ctx.receipt:with_primary_source(ctx.receipt.github_release(repo, release))
+ platform.when {
+ unix = function()
+ ctx:link_bin(
+ "haskell-language-server-wrapper",
+ path.concat { "bin", "haskell-language-server-wrapper" }
+ )
+
+ a.scheduler()
+ for _, executable_abs_path in
+ ipairs(
+ vim.fn.glob(path.concat { ctx.cwd:get(), "bin", "haskell-language-server-[0-9]*" }, true, true)
+ )
+ do
+ local executable = vim.fn.fnamemodify(executable_abs_path, ":t")
+ ctx:link_bin(executable, path.concat { "bin", executable })
+ end
+ end,
+ win = function()
+ ctx:link_bin("haskell-language-server-wrapper", "haskell-language-server-wrapper.exe")
+
+ a.scheduler()
+ for _, executable_abs_path in
+ ipairs(vim.fn.glob(path.concat { ctx.cwd:get(), "haskell-language-server-[0-9]*" }, true, true))
+ do
+ local executable = vim.fn.fnamemodify(executable_abs_path, ":t:r")
+ ctx:link_bin(executable, ("%s.exe"):format(executable))
+ end
+ end,
+ }
+ end,
+}
diff --git a/lua/mason/packages/haxe-language-server/init.lua b/lua/mason/packages/haxe-language-server/init.lua
new file mode 100644
index 00000000..22f6b5be
--- /dev/null
+++ b/lua/mason/packages/haxe-language-server/init.lua
@@ -0,0 +1,25 @@
+local Pkg = require "mason.core.package"
+local std = require "mason.core.managers.std"
+local git = require "mason.core.managers.git"
+local npm = require "mason.core.managers.npm"
+local path = require "mason.core.path"
+
+return Pkg.new {
+ name = "haxe-language-server",
+ desc = [[Language Server Protocol implementation for the Haxe language]],
+ homepage = "https://github.com/vshaxe/haxe-language-server",
+ languages = { Pkg.Lang.Haxe },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ std.ensure_executable("haxelib", { help_url = "https://haxe.org" })
+ git.clone({ "https://github.com/vshaxe/haxe-language-server" }).with_receipt()
+ ctx.spawn.npm { "install" }
+ npm.exec { "lix", "run", "vshaxe-build", "-t", "language-server" }
+ ctx:link_bin(
+ "haxe-language-server",
+ ctx:write_node_exec_wrapper("haxe-language-server", path.concat { "bin", "server.js" })
+ )
+ end,
+}
diff --git a/lua/mason/packages/hoon-language-server/init.lua b/lua/mason/packages/hoon-language-server/init.lua
new file mode 100644
index 00000000..c9fbbcbc
--- /dev/null
+++ b/lua/mason/packages/hoon-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "hoon-language-server",
+ desc = [[Language Server for Hoon. Middleware to translate between the Language Server Protocol and your Urbit.]],
+ homepage = "https://github.com/urbit/hoon-language-server",
+ languages = { Pkg.Lang.Hoon },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@urbit/hoon-language-server", bin = { "hoon-language-server" } },
+}
diff --git a/lua/mason/packages/html-lsp/init.lua b/lua/mason/packages/html-lsp/init.lua
new file mode 100644
index 00000000..40e41bdb
--- /dev/null
+++ b/lua/mason/packages/html-lsp/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "html-lsp",
+ desc = [[Language Server Protocol implementation for HTML.]],
+ homepage = "https://github.com/microsoft/vscode-html-languageservice",
+ languages = { Pkg.Lang.HTML },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "vscode-langservers-extracted", bin = { "vscode-html-language-server" } },
+}
diff --git a/lua/mason/packages/intelephense/init.lua b/lua/mason/packages/intelephense/init.lua
new file mode 100644
index 00000000..4f0fc2fc
--- /dev/null
+++ b/lua/mason/packages/intelephense/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "intelephense",
+ desc = [[Professional PHP tooling for any Language Server Protocol capable editor.]],
+ homepage = "https://intelephense.com",
+ languages = { Pkg.Lang.PHP },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "intelephense", bin = { "intelephense" } },
+}
diff --git a/lua/mason/packages/jdtls/init.lua b/lua/mason/packages/jdtls/init.lua
new file mode 100644
index 00000000..e3bf7e65
--- /dev/null
+++ b/lua/mason/packages/jdtls/init.lua
@@ -0,0 +1,44 @@
+local Pkg = require "mason.core.package"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local installer = require "mason.core.installer"
+local eclipse = require "mason.core.clients.eclipse"
+local std = require "mason.core.managers.std"
+
+---@async
+local function download_jdtls()
+ local ctx = installer.context()
+ local version = ctx.requested_version:or_else_get(function()
+ return eclipse.fetch_latest_jdtls_version():get_or_throw()
+ end)
+
+ std.download_file(
+ ("https://download.eclipse.org/jdtls/snapshots/jdt-language-server-%s.tar.gz"):format(version),
+ "archive.tar.gz"
+ )
+ std.untar "archive.tar.gz"
+
+ ctx.receipt:with_primary_source {
+ type = "jdtls",
+ version = version,
+ }
+end
+
+---@async
+local function download_lombok()
+ std.download_file("https://projectlombok.org/downloads/lombok.jar", "lombok.jar")
+end
+
+return Pkg.new {
+ name = "jdtls",
+ desc = [[Java language server]],
+ homepage = "https://github.com/eclipse/eclipse.jdt.ls",
+ languages = { Pkg.Lang.Java },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ install = function()
+ std.ensure_executable "java"
+ installer.run_concurrently { download_jdtls, download_lombok }
+ end,
+}
diff --git a/lua/mason/packages/jedi-language-server/init.lua b/lua/mason/packages/jedi-language-server/init.lua
new file mode 100644
index 00000000..7c7d2e25
--- /dev/null
+++ b/lua/mason/packages/jedi-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "jedi-language-server",
+ desc = [[A Python language server exclusively for Jedi. If Jedi supports it well, this language server should too.]],
+ homepage = "https://github.com/pappasam/jedi-language-server",
+ languages = { Pkg.Lang.Python },
+ categories = { Pkg.Cat.LSP },
+ install = pip3.packages { "jedi-language-server", bin = { "jedi-language-server" } },
+}
diff --git a/lua/mason/packages/json-lsp/init.lua b/lua/mason/packages/json-lsp/init.lua
new file mode 100644
index 00000000..c6be908b
--- /dev/null
+++ b/lua/mason/packages/json-lsp/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "json-lsp",
+ desc = [[Language Server Protocol implementation for JSON.]],
+ homepage = "https://github.com/microsoft/vscode-json-languageservice",
+ languages = { Pkg.Lang.JSON },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "vscode-langservers-extracted", bin = { "vscode-json-language-server" } },
+}
diff --git a/lua/mason/packages/jsonnet-language-server/init.lua b/lua/mason/packages/jsonnet-language-server/init.lua
new file mode 100644
index 00000000..04c2516a
--- /dev/null
+++ b/lua/mason/packages/jsonnet-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local go = require "mason.core.managers.go"
+
+return Pkg.new {
+ name = "jsonnet-language-server",
+ desc = [[A Language Server Protocol (LSP) server for Jsonnet (https://jsonnet.org)]],
+ homepage = "https://github.com/grafana/jsonnet-language-server",
+ languages = { Pkg.Lang.Jsonnet },
+ categories = { Pkg.Cat.LSP },
+ install = go.packages { "github.com/grafana/jsonnet-language-server", bin = { "jsonnet-language-server" } },
+}
diff --git a/lua/mason/packages/julia-lsp/init.lua b/lua/mason/packages/julia-lsp/init.lua
new file mode 100644
index 00000000..cd4bf1f5
--- /dev/null
+++ b/lua/mason/packages/julia-lsp/init.lua
@@ -0,0 +1,57 @@
+local Pkg = require "mason.core.package"
+local path = require "mason.core.path"
+local std = require "mason.core.managers.std"
+local github = require "mason.core.managers.github"
+
+local server_script = [[
+using LanguageServer, SymbolServer, Pkg
+
+OLD_DEPOT_PATH = ARGS[1]
+SYMBOLSTORE_PATH = ARGS[2]
+ENV_PATH = ARGS[3]
+
+runserver(
+ stdin,
+ stdout,
+ ENV_PATH,
+ OLD_DEPOT_PATH,
+ nothing,
+ SYMBOLSTORE_PATH
+)
+]]
+
+return Pkg.new {
+ name = "julia-lsp",
+ desc = [[An implementation of the Microsoft Language Server Protocol for the Julia language.]],
+ homepage = "https://github.com/julia-vscode/LanguageServer.jl",
+ languages = { Pkg.Lang.Julia },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ std.ensure_executable("julia", { help_url = "https://julialang.org/downloads/" })
+
+ ctx.fs:mkdir "vscode-package"
+ ctx:chdir("vscode-package", function()
+ github.unzip_release_file({
+ repo = "julia-vscode/julia-vscode",
+ asset_file = function(version)
+ local version_number = version:gsub("^v", "")
+ return ("language-julia-%s.vsix"):format(version_number)
+ end,
+ }).with_receipt()
+ end)
+
+ ctx.fs:rename(
+ path.concat {
+ "vscode-package",
+ "extension",
+ "scripts",
+ },
+ "scripts"
+ )
+ ctx.fs:rmrf "vscode-package"
+
+ ctx.fs:write_file("nvim-lsp.jl", server_script)
+ end,
+}
diff --git a/lua/mason/packages/kotlin-language-server/init.lua b/lua/mason/packages/kotlin-language-server/init.lua
new file mode 100644
index 00000000..71152bda
--- /dev/null
+++ b/lua/mason/packages/kotlin-language-server/init.lua
@@ -0,0 +1,28 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local platform = require "mason.core.platform"
+local path = require "mason.core.path"
+
+return Pkg.new {
+ name = "kotlin-language-server",
+ desc = [[Kotlin code completion, linting and more for any editor/IDE using the Language Server Protocol]],
+ homepage = "https://github.com/fwcd/kotlin-language-server",
+ languages = { Pkg.Lang.Kotlin },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "fwcd/kotlin-language-server",
+ asset_file = "server.zip",
+ }).with_receipt()
+ ctx:link_bin(
+ "kotlin-language-server",
+ path.concat {
+ "server",
+ "bin",
+ platform.is.win and "kotlin-language-server.bat" or "kotlin-language-server",
+ }
+ )
+ end,
+}
diff --git a/lua/mason/packages/lelwel/init.lua b/lua/mason/packages/lelwel/init.lua
new file mode 100644
index 00000000..6bb326e1
--- /dev/null
+++ b/lua/mason/packages/lelwel/init.lua
@@ -0,0 +1,14 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "lelwel",
+ desc = [[LL(1) parser generator for Rust]],
+ homepage = "https://github.com/0x2a-42/lelwel",
+ languages = { Pkg.Lang.Lelwel },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("lelwel", {
+ features = "lsp,cli",
+ bin = { "lelwel-ls", "llw" },
+ }),
+}
diff --git a/lua/mason/packages/lemminx/init.lua b/lua/mason/packages/lemminx/init.lua
new file mode 100644
index 00000000..be094e14
--- /dev/null
+++ b/lua/mason/packages/lemminx/init.lua
@@ -0,0 +1,41 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "lemminx",
+ desc = [[XML Language Server]],
+ homepage = "https://github.com/eclipse/lemminx",
+ languages = { Pkg.Lang.XML },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local unzipped_file = assert(
+ coalesce(
+ when(platform.is.mac, "lemminx-osx-x86_64"),
+ when(platform.is.linux_x64, "lemminx-linux"),
+ when(platform.is.win, "lemminx-win32")
+ ),
+ ("Your operating system or architecture (%q) is not yet supported."):format(platform.arch)
+ )
+
+ std.download_file(
+ ("https://download.jboss.org/jbosstools/vscode/snapshots/lemminx-binary/%s/%s.zip"):format(
+ ctx.requested_version:or_else "0.19.2-655", -- TODO: resolve latest version dynamically
+ unzipped_file
+ ),
+ "lemminx.zip"
+ )
+ std.unzip("lemminx.zip", ".")
+ ctx.fs:rename(
+ platform.is.win and ("%s.exe"):format(unzipped_file) or unzipped_file,
+ platform.is.win and "lemminx.exe" or "lemminx"
+ )
+ ctx.receipt:with_primary_source(ctx.receipt.unmanaged)
+ ctx:link_bin("lemminx", platform.is.win and "lemminx.exe" or "lemminx")
+ end,
+}
diff --git a/lua/mason/packages/lemmy-help/init.lua b/lua/mason/packages/lemmy-help/init.lua
new file mode 100644
index 00000000..1cd04e61
--- /dev/null
+++ b/lua/mason/packages/lemmy-help/init.lua
@@ -0,0 +1,14 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "lemmy-help",
+ desc = [[Every one needs help, so lemmy-help you! A CLI to generate vim/nvim help doc from emmylua]],
+ homepage = "https://github.com/numToStr/lemmy-help",
+ categories = {},
+ languages = { Pkg.Lang.Lua },
+ install = cargo.crate("lemmy-help", {
+ features = "cli",
+ bin = { "lemmy-help" },
+ }),
+}
diff --git a/lua/mason/packages/ltex-ls/init.lua b/lua/mason/packages/ltex-ls/init.lua
new file mode 100644
index 00000000..ba5e2bbc
--- /dev/null
+++ b/lua/mason/packages/ltex-ls/init.lua
@@ -0,0 +1,72 @@
+local Pkg = require "mason.core.package"
+local a = require "mason.core.async"
+local installer = require "mason.core.installer"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+local path = require "mason.core.path"
+
+local coalesce, when = _.coalesce, _.when
+
+local repo = "valentjn/ltex-ls"
+---@async
+local function download_platform_dependent()
+ local ctx = installer.context()
+ local source = platform.when {
+ unix = function()
+ return github.untargz_release_file {
+ repo = repo,
+ asset_file = function(version)
+ local target = coalesce(
+ when(platform.is_mac, "ltex-ls-%s-mac-x64.tar.gz"),
+ when(platform.is_linux, "ltex-ls-%s-linux-x64.tar.gz"),
+ when(platform.is_win, "ltex-ls-%s-windows-x64.zip")
+ )
+ return target:format(version)
+ end,
+ }
+ end,
+ win = function()
+ return github.unzip_release_file {
+ repo = repo,
+ asset_file = function(version)
+ return ("ltex-ls-%s-windows-x64.zip"):format(version)
+ end,
+ }
+ end,
+ }
+ source.with_receipt()
+ ctx.fs:rename(("ltex-ls-%s"):format(source.release), "ltex-ls")
+end
+
+local function download_platform_independent()
+ local ctx = installer.context()
+ local source = github.untargz_release_file {
+ repo = repo,
+ asset_file = _.format "ltex-ls-%s.tar.gz",
+ }
+ source.with_receipt()
+ ctx.fs:rename(("ltex-ls-%s"):format(source.release), "ltex-ls")
+end
+
+return Pkg.new {
+ name = "ltex-ls",
+ desc = [[LTeX Language Server: LSP language server for LanguageTool 🔍✔️ with support for LaTeX 🎓, Markdown 📝, and others]],
+ homepage = "https://valentjn.github.io/ltex/",
+ languages = { Pkg.Lang.Text, Pkg.Lang.Markdown, Pkg.Lang.LaTeX },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ if vim.in_fast_event() then
+ a.scheduler()
+ end
+ if vim.fn.executable "java" == 1 then
+ download_platform_independent()
+ else
+ download_platform_dependent()
+ end
+ ctx:link_bin("ltex-ls", path.concat { "ltex-ls", "bin", platform.is.win and "ltex-ls.bat" or "ltex-ls" })
+ ctx:link_bin("ltex-cli", path.concat { "ltex-ls", "bin", platform.is.win and "ltex-cli.bat" or "ltex-cli" })
+ end,
+}
diff --git a/lua/mason/packages/lua-language-server/init.lua b/lua/mason/packages/lua-language-server/init.lua
new file mode 100644
index 00000000..9e1436a3
--- /dev/null
+++ b/lua/mason/packages/lua-language-server/init.lua
@@ -0,0 +1,60 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local path = require "mason.core.path"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "lua-language-server",
+ desc = [[Lua Language Server]],
+ languages = { Pkg.Lang.Lua },
+ categories = { Pkg.Cat.LSP },
+ homepage = "https://github.com/sumneko/lua-language-server",
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "sumneko/vscode-lua",
+ asset_file = function(version)
+ local target = coalesce(
+ when(platform.is.mac_x64, "vscode-lua-%s-darwin-x64.vsix"),
+ when(platform.is.mac_arm64, "vscode-lua-%s-darwin-arm64.vsix"),
+ when(platform.is.linux_x64, "vscode-lua-%s-linux-x64.vsix"),
+ when(platform.is.linux_arm64, "vscode-lua-%s-linux-arm64.vsix"),
+ when(platform.is.win_x64, "vscode-lua-%s-win32-x64.vsix"),
+ when(platform.is.win_x86, "vscode-lua-%s-win32-ia32.vsix")
+ )
+
+ return target and target:format(version)
+ end,
+ }).with_receipt()
+
+ platform.when {
+ unix = function()
+ ctx:write_exec_wrapper(
+ "lua-language-server",
+ path.concat {
+ "extension",
+ "server",
+ "bin",
+ "lua-language-server",
+ }
+ )
+ ctx:link_bin("lua-language-server", "lua-language-server")
+ end,
+ win = function()
+ ctx:link_bin(
+ "lua-language-server",
+ path.concat {
+ "extension",
+ "server",
+ "bin",
+ "lua-language-server.exe",
+ }
+ )
+ end,
+ }
+ end,
+}
diff --git a/lua/mason/packages/marksman/init.lua b/lua/mason/packages/marksman/init.lua
new file mode 100644
index 00000000..bd9d8e3a
--- /dev/null
+++ b/lua/mason/packages/marksman/init.lua
@@ -0,0 +1,30 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "marksman",
+ desc = [[Markdown LSP server providing completion, cross-references, diagnostics, and more.]],
+ homepage = "https://github.com/artempyanykh/marksman",
+ languages = { Pkg.Lang.Markdown },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.download_release_file({
+ repo = "artempyanykh/marksman",
+ out_file = platform.is.win and "marksman.exe" or "marksman",
+ asset_file = coalesce(
+ when(platform.is.mac, "marksman-macos"),
+ when(platform.is.linux_x64, "marksman-linux"),
+ when(platform.is.win_x64, "marksman.exe")
+ ),
+ }).with_receipt()
+ std.chmod("+x", { "marksman" })
+ ctx:link_bin("marksman", platform.is.win and "marksman.exe" or "marksman")
+ end,
+}
diff --git a/lua/mason/packages/metamath-zero-lsp/init.lua b/lua/mason/packages/metamath-zero-lsp/init.lua
new file mode 100644
index 00000000..97272fbb
--- /dev/null
+++ b/lua/mason/packages/metamath-zero-lsp/init.lua
@@ -0,0 +1,24 @@
+local Pkg = require "mason.core.package"
+local git = require "mason.core.managers.git"
+local platform = require "mason.core.platform"
+local path = require "mason.core.path"
+
+return Pkg.new {
+ name = "metamath-zero-lsp",
+ desc = [[An MM0/MM1 server written in Rust.]],
+ homepage = "https://github.com/digama0/mm0",
+ languages = { Pkg.Lang["Metamath Zero"] },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ git.clone({ "https://github.com/digama0/mm0" }).with_receipt()
+ ctx:chdir("mm0-rs", function()
+ ctx.spawn.cargo { "build", "--release" }
+ end)
+ ctx:link_bin(
+ "mm0-rs",
+ path.concat { "mm0-rs", "target", "release", platform.is.win and "mm0-rs.exe" or "mm0-rs" }
+ )
+ end,
+}
diff --git a/lua/mason/packages/mockdebug/init.lua b/lua/mason/packages/mockdebug/init.lua
new file mode 100644
index 00000000..9898b2df
--- /dev/null
+++ b/lua/mason/packages/mockdebug/init.lua
@@ -0,0 +1,23 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local git = require "mason.core.managers.git"
+local _ = require "mason.core.functional"
+local Optional = require "mason.core.optional"
+
+return Pkg.new {
+ name = "mockdebug",
+ desc = [[Mock Debug simulates a debug adapter. It supports step, continue, breakpoints, exceptions, and variable access but it is not connected to any real debugger.]],
+ homepage = "https://github.com/microsoft/vscode-mock-debug",
+ languages = {},
+ categories = { Pkg.Cat.DAP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local source = github.tag { repo = "microsoft/vscode-mock-debug" }
+ source.with_receipt()
+ git.clone { "https://github.com/microsoft/vscode-mock-debug", version = Optional.of(source.tag) }
+ ctx.spawn.npm { "install" }
+ ctx.spawn.npm { "run", "compile" }
+ ctx.spawn.npm { "install", "--production" }
+ end,
+}
diff --git a/lua/mason/packages/nickel-lang-lsp/init.lua b/lua/mason/packages/nickel-lang-lsp/init.lua
new file mode 100644
index 00000000..104162ba
--- /dev/null
+++ b/lua/mason/packages/nickel-lang-lsp/init.lua
@@ -0,0 +1,15 @@
+local Pkg = require "mason.core.package"
+local path = require "mason.core.path"
+local cargo = require "mason.core.managers.cargo"
+local git = require "mason.core.managers.git"
+
+return Pkg.new {
+ name = "nickel-lang-lsp",
+ desc = [[The Nickel Language Server (NLS) is a language server for the Nickel programming language. NLS offers error messages, type hints, and auto-completion right in your favorite LSP-enabled editor.]],
+ homepage = "https://nickel-lang.org/",
+ languages = { Pkg.Lang.Nickel },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("nickel-lang-lsp", {
+ bin = { "nls" },
+ }),
+}
diff --git a/lua/mason/packages/nimlsp/init.lua b/lua/mason/packages/nimlsp/init.lua
new file mode 100644
index 00000000..75dd0752
--- /dev/null
+++ b/lua/mason/packages/nimlsp/init.lua
@@ -0,0 +1,22 @@
+local Pkg = require "mason.core.package"
+local git = require "mason.core.managers.git"
+local github = require "mason.core.managers.github"
+local platform = require "mason.core.platform"
+local Optional = require "mason.core.optional"
+
+return Pkg.new {
+ name = "nimlsp",
+ desc = [[Language Server Protocol implementation for Nim]],
+ homepage = "https://github.com/PMunch/nimlsp",
+ languages = { Pkg.Lang.Nim },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local source = github.tag { repo = "PMunch/nimlsp" }
+ source.with_receipt()
+ git.clone { "https://github.com/PMunch/nimlsp", version = Optional.of(source.tag) }
+ ctx.spawn.nimble { "build", "-y", "--localdeps" }
+ ctx:link_bin("nimlsp", platform.is.win and "nimlsp.exe" or "nimlsp")
+ end,
+}
diff --git a/lua/mason/packages/ocaml-lsp/init.lua b/lua/mason/packages/ocaml-lsp/init.lua
new file mode 100644
index 00000000..b13f0f38
--- /dev/null
+++ b/lua/mason/packages/ocaml-lsp/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local opam = require "mason.core.managers.opam"
+
+return Pkg.new {
+ name = "ocaml-lsp",
+ desc = [[OCaml Language Server Protocol implementation]],
+ homepage = "https://github.com/ocaml/ocaml-lsp",
+ languages = { Pkg.Lang.OCaml },
+ categories = { Pkg.Cat.LSP },
+ install = opam.packages { "ocaml-lsp-server", bin = { "ocamllsp" } },
+}
diff --git a/lua/mason/packages/omnisharp-roslyn/init.lua b/lua/mason/packages/omnisharp-roslyn/init.lua
new file mode 100644
index 00000000..3f72bc4f
--- /dev/null
+++ b/lua/mason/packages/omnisharp-roslyn/init.lua
@@ -0,0 +1,41 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "omnisharp-roslyn",
+ desc = [[OmniSharp server (HTTP, STDIO) based on Roslyn workspaces]],
+ homepage = "https://github.com/OmniSharp/omnisharp-roslyn",
+ languages = { Pkg.Lang["C#"] },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ ctx.fs:mkdir "omnisharp"
+ ctx:chdir("omnisharp", function()
+ github.unzip_release_file {
+ repo = "OmniSharp/omnisharp-roslyn",
+ asset_file = coalesce(
+ when(platform.is.mac_x64, "omnisharp-osx-x64-net6.0.zip"),
+ when(platform.is.mac_arm64, "omnisharp-osx-arm64-net6.0.zip"),
+ when(platform.is.linux_x64, "omnisharp-linux-x64-net6.0.zip"),
+ when(platform.is.linux_arm64, "omnisharp-linux-arm64-net6.0.zip"),
+ when(platform.is.win_x64, "omnisharp-win-x64-net6.0.zip"),
+ when(platform.is.win_arm64, "omnisharp-win-arm64-net6.0.zip")
+ ),
+ }
+ end)
+
+ ctx.fs:mkdir "omnisharp-mono"
+ ctx:chdir("omnisharp-mono", function()
+ github.unzip_release_file({
+ repo = "OmniSharp/omnisharp-roslyn",
+ asset_file = "omnisharp-mono.zip",
+ }).with_receipt()
+ end)
+ end,
+}
diff --git a/lua/mason/packages/opencl-language-server/init.lua b/lua/mason/packages/opencl-language-server/init.lua
new file mode 100644
index 00000000..e1f754d5
--- /dev/null
+++ b/lua/mason/packages/opencl-language-server/init.lua
@@ -0,0 +1,40 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "opencl-language-server",
+ desc = [[Provides an OpenCL kernel diagnostics]],
+ homepage = "https://github.com/Galarius/opencl-language-server",
+ languages = { Pkg.Lang.OpenCL },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ platform.when {
+ unix = function()
+ local asset_file = coalesce(
+ when(platform.is.mac, "opencl-language-server-darwin-x86_64.tar.gz"),
+ when(platform.is.linux_x64, "opencl-language-server-linux-x86_64.tar.gz")
+ )
+ github.untargz_release_file({
+ repo = "Galarius/opencl-language-server",
+ asset_file = asset_file,
+ }).with_receipt()
+ end,
+ win = function()
+ github.unzip_release_file({
+ repo = "Galarius/opencl-language-server",
+ asset_file = "opencl-language-server-win32-x86_64.zip",
+ }).with_receipt()
+ end,
+ }
+ ctx:link_bin(
+ "opencl-language-server",
+ platform.is.win and "opencl-language-server.exe" or "opencl-language-server"
+ )
+ end,
+}
diff --git a/lua/mason/packages/perlnavigator/init.lua b/lua/mason/packages/perlnavigator/init.lua
new file mode 100644
index 00000000..5825406f
--- /dev/null
+++ b/lua/mason/packages/perlnavigator/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "perlnavigator",
+ desc = [[Perl Language Server that includes perl critic and code navigation]],
+ homepage = "https://github.com/bscan/PerlNavigator",
+ languages = { Pkg.Lang.Perl },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "perlnavigator-server" },
+}
diff --git a/lua/mason/packages/phpactor/init.lua b/lua/mason/packages/phpactor/init.lua
new file mode 100644
index 00000000..b01eed50
--- /dev/null
+++ b/lua/mason/packages/phpactor/init.lua
@@ -0,0 +1,25 @@
+local Pkg = require "mason.core.package"
+local composer = require "mason.core.managers.composer"
+local git = require "mason.core.managers.git"
+local github = require "mason.core.managers.github"
+local platform = require "mason.core.platform"
+local Optional = require "mason.core.optional"
+local path = require "mason.core.path"
+
+return Pkg.new {
+ name = "phpactor",
+ desc = [[Phpactor is an intelligent Completion and Refactoring tool for PHP which is available over it’s own RPC protocol and as a Language Server.]],
+ homepage = "https://phpactor.readthedocs.io/en/master/",
+ languages = { Pkg.Lang.PHP },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ assert(platform.is.unix, "phpactor only supports UNIX environments.")
+ local source = github.tag { repo = "phpactor/phpactor" }
+ source.with_receipt()
+ git.clone { "https://github.com/phpactor/phpactor", version = Optional.of(source.tag) }
+ composer.install()
+ ctx:link_bin("phpactor", path.concat { "bin", "phpactor" })
+ end,
+}
diff --git a/lua/mason/packages/powershell-editor-services/init.lua b/lua/mason/packages/powershell-editor-services/init.lua
new file mode 100644
index 00000000..9136fa53
--- /dev/null
+++ b/lua/mason/packages/powershell-editor-services/init.lua
@@ -0,0 +1,19 @@
+local Pkg = require "mason.core.package"
+local std = require "mason.core.managers.std"
+local github = require "mason.core.managers.github"
+
+return Pkg.new {
+ name = "powershell-editor-services",
+ desc = [[A common platform for PowerShell development support in any editor or application!]],
+ homepage = "https://github.com/PowerShell/PowerShellEditorServices",
+ languages = { Pkg.Lang.PowerShell },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ install = function()
+ std.ensure_executable("pwsh", { help_url = "https://github.com/PowerShell/PowerShell#get-powershell" })
+ github.unzip_release_file({
+ repo = "PowerShell/PowerShellEditorServices",
+ asset_file = "PowerShellEditorServices.zip",
+ }).with_receipt()
+ end,
+}
diff --git a/lua/mason/packages/prisma-language-server/init.lua b/lua/mason/packages/prisma-language-server/init.lua
new file mode 100644
index 00000000..0ca4ac61
--- /dev/null
+++ b/lua/mason/packages/prisma-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "prisma-language-server",
+ desc = [[Any editor that is compatible with the Language Server Protocol can create clients that can use the features provided by this language server.]],
+ homepage = "https://github.com/prisma/language-tools",
+ languages = { Pkg.Lang.Prisma },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@prisma/language-server", bin = { "prisma-language-server" } },
+}
diff --git a/lua/mason/packages/prosemd-lsp/init.lua b/lua/mason/packages/prosemd-lsp/init.lua
new file mode 100644
index 00000000..18fc623b
--- /dev/null
+++ b/lua/mason/packages/prosemd-lsp/init.lua
@@ -0,0 +1,30 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "prosemd-lsp",
+ desc = [[An experimental proofreading and linting language server for markdown files ✍️]],
+ homepage = "https://github.com/kitten/prosemd-lsp",
+ languages = { Pkg.Lang.Markdown },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.download_release_file({
+ repo = "kitten/prosemd-lsp",
+ out_file = platform.is_win and "prosemd-lsp.exe" or "prosemd-lsp",
+ asset_file = coalesce(
+ when(platform.is_mac, "prosemd-lsp-macos"),
+ when(platform.is_linux and platform.arch == "x64", "prosemd-lsp-linux"),
+ when(platform.is_win and platform.arch == "x64", "prosemd-lsp-windows.exe")
+ ),
+ }).with_receipt()
+ std.chmod("+x", { "prosemd-lsp" })
+ ctx:link_bin("prosemd-lsp", platform.is.win and "prosemd-lsp.exe" or "prosemd-lsp")
+ end,
+}
diff --git a/lua/mason/packages/psalm/init.lua b/lua/mason/packages/psalm/init.lua
new file mode 100644
index 00000000..fd9a9c6d
--- /dev/null
+++ b/lua/mason/packages/psalm/init.lua
@@ -0,0 +1,20 @@
+local Pkg = require "mason.core.package"
+local composer = require "mason.core.managers.composer"
+
+return Pkg.new {
+ name = "psalm",
+ desc = [[A static analysis tool for finding errors in PHP applications]],
+ homepage = "https://psalm.dev/",
+ languages = { Pkg.Lang.PHP },
+ categories = { Pkg.Cat.LSP },
+ install = composer.packages {
+ "vimeo/psalm",
+ bin = {
+ "psalm",
+ "psalm-language-server",
+ "psalm-plugin",
+ "psalm-refactor",
+ "psalter",
+ },
+ },
+}
diff --git a/lua/mason/packages/puppet-editor-services/init.lua b/lua/mason/packages/puppet-editor-services/init.lua
new file mode 100644
index 00000000..c5c702ec
--- /dev/null
+++ b/lua/mason/packages/puppet-editor-services/init.lua
@@ -0,0 +1,24 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local platform = require "mason.core.platform"
+
+return Pkg.new {
+ name = "puppet-editor-services",
+ desc = [[Puppet Language Server for editors]],
+ homepage = "https://github.com/puppetlabs/puppet-editor-services",
+ languages = { Pkg.Lang.Puppet },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.DAP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ assert(platform.is.unix, "puppet-editor-services only supports UNIX environments.")
+ github.unzip_release_file({
+ repo = "puppetlabs/puppet-editor-services",
+ asset_file = function(version)
+ return ("puppet_editor_services_%s.zip"):format(version)
+ end,
+ }).with_receipt()
+ ctx:link_bin("puppet-languageserver", "puppet-languageserver")
+ ctx:link_bin("puppet-debugserver", "puppet-debugserver")
+ end,
+}
diff --git a/lua/mason/packages/purescript-language-server/init.lua b/lua/mason/packages/purescript-language-server/init.lua
new file mode 100644
index 00000000..86a4de25
--- /dev/null
+++ b/lua/mason/packages/purescript-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "purescript-language-server",
+ desc = [[Node-based Language Server Protocol server for PureScript based on the PureScript IDE server (aka psc-ide / purs ide server). Used as the vscode plugin backend but should be compatible with other Language Server Client implementations.]],
+ languages = { Pkg.Lang.PureScript },
+ categories = { Pkg.Cat.LSP },
+ homepage = "https://github.com/nwolverson/purescript-language-server",
+ install = npm.packages { "purescript-language-server", bin = { "purescript-language-server" } },
+}
diff --git a/lua/mason/packages/pyright/init.lua b/lua/mason/packages/pyright/init.lua
new file mode 100644
index 00000000..b03bbd5a
--- /dev/null
+++ b/lua/mason/packages/pyright/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "pyright",
+ desc = [[Static type checker for Python]],
+ homepage = "https://github.com/microsoft/pyright",
+ languages = { Pkg.Lang.Python },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "pyright", bin = { "pyright", "pyright-langserver" } },
+}
diff --git a/lua/mason/packages/python-lsp-server/init.lua b/lua/mason/packages/python-lsp-server/init.lua
new file mode 100644
index 00000000..2ba0e8d6
--- /dev/null
+++ b/lua/mason/packages/python-lsp-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "python-lsp-server",
+ desc = [[Fork of the python-language-server project, maintained by the Spyder IDE team and the community]],
+ homepage = "https://github.com/python-lsp/python-lsp-server",
+ languages = { Pkg.Lang.Python },
+ categories = { Pkg.Cat.LSP },
+ install = pip3.packages { "python-lsp-server[all]", bin = { "pylsp" } },
+}
diff --git a/lua/mason/packages/quick-lint-js/init.lua b/lua/mason/packages/quick-lint-js/init.lua
new file mode 100644
index 00000000..8719a835
--- /dev/null
+++ b/lua/mason/packages/quick-lint-js/init.lua
@@ -0,0 +1,50 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local std = require "mason.core.managers.std"
+local github = require "mason.core.managers.github"
+local path = require "mason.core.path"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "quick-lint-js",
+ desc = [[Over 130× faster than ESLint, quick-lint-js gives you instant feedback as you code. Find bugs in your JavaScript before your finger leaves the keyboard. Lint any JavaScript file with no configuration.]],
+ homepage = "https://quick-lint-js.com/",
+ languages = { Pkg.Lang.JavaScript },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.Linter },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "quick-lint/quick-lint-js"
+ local release_file = assert(
+ coalesce(
+ when(platform.is.mac_x64, "macos.tar.gz"),
+ when(platform.is.mac_arm64, "macos-aarch64.tar.gz"),
+ when(platform.is.linux_x64, "linux.tar.gz"),
+ when(platform.is.linux_arm64, "linux-aarch64.tar.gz"),
+ when(platform.is.linux_arm, "linux-armhf.tar.gz"),
+ when(platform.is.win_x64, "windows.zip"),
+ when(platform.is.win_arm64, "windows-arm64.zip"),
+ when(platform.is.win_arm, "windows-arm.zip")
+ ),
+ "Current platform is not supported."
+ )
+
+ local source = github.tag { repo = repo }
+ source.with_receipt()
+
+ local url = ("https://c.quick-lint-js.com/releases/%s/manual/%s"):format(source.tag, release_file)
+ platform.when {
+ unix = function()
+ std.download_file(url, "archive.tar.gz")
+ std.untar("archive.tar.gz", { strip_components = 1 })
+ end,
+ win = function()
+ std.download_file(url, "archive.zip")
+ std.unzip("archive.zip", ".")
+ end,
+ }
+ ctx:link_bin("quick-lint-js", path.concat { "bin", platform.is.win and "quick-lint-js.exe" or "quick-lint-js" })
+ end,
+}
diff --git a/lua/nvim-lsp-installer/servers/r_language_server/init.lua b/lua/mason/packages/r-languageserver/init.lua
index 6b665adf..7dbf1123 100644
--- a/lua/nvim-lsp-installer/servers/r_language_server/init.lua
+++ b/lua/mason/packages/r-languageserver/init.lua
@@ -1,9 +1,8 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
+local Pkg = require "mason.core.package"
-return function(name, root_dir)
- local function create_install_script(install_dir)
- return ([[
+---@param install_dir string
+local function create_install_script(install_dir)
+ return ([[
options(langserver_library = %q);
options(langserver_quiet = FALSE);
options(repos = list(CRAN = "http://cran.rstudio.com/"));
@@ -36,36 +35,37 @@ languageserversetup::languageserver_install(
);
library("languageserver", lib.loc = rlsLib);
]]):format(install_dir)
- end
+end
- local server_script = ([[
+---@param install_dir string
+local function create_server_script(install_dir)
+ return ([[
options("langserver_library" = %q);
rlsLib <- getOption("langserver_library");
.libPaths(new = c(rlsLib, .libPaths()));
loadNamespace("languageserver", lib.loc = rlsLib);
languageserver::run();
- ]]):format(root_dir)
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/REditorSupport/languageserver",
- languages = { "R" },
- ---@param ctx InstallContext
- installer = function(ctx)
- ctx.spawn.R {
- "--no-save",
- on_spawn = function(_, stdio)
- local stdin = stdio[1]
- stdin:write(create_install_script(ctx.cwd:get()))
- stdin:close()
- end,
- }
- ctx.fs:write_file("server.R", server_script)
- ctx.receipt:with_primary_source(ctx.receipt.r_package "languageserver")
- end,
- default_options = {
- cmd = { "R", "--slave", "-f", path.concat { root_dir, "server.R" } },
- },
- }
+ ]]):format(install_dir)
end
+
+return Pkg.new {
+ name = "r-languageserver",
+ desc = [[]],
+ homepage = "https://github.com/REditorSupport/languageserver",
+ languages = { Pkg.Lang.R },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ ctx.spawn.R {
+ "--no-save",
+ on_spawn = function(_, stdio)
+ local stdin = stdio[1]
+ stdin:write(create_install_script(ctx.cwd:get()))
+ stdin:close()
+ end,
+ }
+ ctx.fs:write_file("server.R", create_server_script(ctx.handle.package:get_install_path()))
+ ctx.receipt:with_primary_source(ctx.receipt.r_package "languageserver")
+ end,
+}
diff --git a/lua/mason/packages/reason-language-server/init.lua b/lua/mason/packages/reason-language-server/init.lua
new file mode 100644
index 00000000..65873a90
--- /dev/null
+++ b/lua/mason/packages/reason-language-server/init.lua
@@ -0,0 +1,36 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local path = require "mason.core.path"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "reason-language-server",
+ desc = [[A language server for reason, in reason]],
+ homepage = "https://github.com/jaredly/reason-language-server",
+ languages = { Pkg.Lang.Reason },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local archive_name = coalesce(
+ when(platform.is.mac, "rls-macos"),
+ when(platform.is.linux_x64, "rls-linux"),
+ when(platform.is.win_x64, "rls-windows")
+ )
+ github.unzip_release_file({
+ repo = "jaredly/reason-language-server",
+ asset_file = ("%s.zip"):format(archive_name),
+ }).with_receipt()
+ ctx.fs:rename(archive_name, "reason")
+ ctx:link_bin(
+ "reason-language-server",
+ path.concat {
+ "reason",
+ platform.is.win and "reason-language-server.exe" or "reason-language-server",
+ }
+ )
+ end,
+}
diff --git a/lua/mason/packages/remark-language-server/init.lua b/lua/mason/packages/remark-language-server/init.lua
new file mode 100644
index 00000000..24d7d8f7
--- /dev/null
+++ b/lua/mason/packages/remark-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "remark-language-server",
+ desc = [[A language server to lint and format markdown files with remark]],
+ homepage = "https://github.com/remarkjs/remark-language-server",
+ languages = { Pkg.Lang.Markdown },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "remark-language-server", bin = { "remark-language-server" } },
+}
diff --git a/lua/mason/packages/rescript-lsp/init.lua b/lua/mason/packages/rescript-lsp/init.lua
new file mode 100644
index 00000000..e12ba749
--- /dev/null
+++ b/lua/mason/packages/rescript-lsp/init.lua
@@ -0,0 +1,19 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+
+return Pkg.new {
+ name = "rescript-lsp",
+ desc = [[Language Server for ReScript.]],
+ homepage = "https://github.com/rescript-lang/rescript-vscode",
+ languages = { Pkg.Lang.ReScript },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ install = function()
+ github.unzip_release_file({
+ repo = "rescript-lang/rescript-vscode",
+ asset_file = function(version)
+ return ("rescript-vscode-%s.vsix"):format(version)
+ end,
+ }).with_receipt()
+ end,
+}
diff --git a/lua/mason/packages/rnix-lsp/init.lua b/lua/mason/packages/rnix-lsp/init.lua
new file mode 100644
index 00000000..d97e9bef
--- /dev/null
+++ b/lua/mason/packages/rnix-lsp/init.lua
@@ -0,0 +1,13 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "rnix-lsp",
+ desc = [[Language Server for Nix]],
+ homepage = "https://github.com/nix-community/rnix-lsp",
+ languages = { Pkg.Lang.Nix },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("rnix-lsp", {
+ bin = { "rnix-lsp" },
+ }),
+}
diff --git a/lua/mason/packages/robotframework-lsp/init.lua b/lua/mason/packages/robotframework-lsp/init.lua
new file mode 100644
index 00000000..13f2f2b9
--- /dev/null
+++ b/lua/mason/packages/robotframework-lsp/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "robotframework-lsp",
+ desc = [[Language Server Protocol implementation for Robot Framework]],
+ homepage = "https://github.com/robocorp/robotframework-lsp",
+ languages = { Pkg.Lang["Robot Framework"] },
+ categories = { Pkg.Cat.LSP },
+ install = pip3.packages { "robotframework-lsp", bin = { "robotframework_ls" } },
+}
diff --git a/lua/mason/packages/rome/init.lua b/lua/mason/packages/rome/init.lua
new file mode 100644
index 00000000..d0f1b59d
--- /dev/null
+++ b/lua/mason/packages/rome/init.lua
@@ -0,0 +1,19 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+local Optional = require "mason.core.optional"
+
+return Pkg.new {
+ name = "rome",
+ desc = [[Rome is a formatter, linter, bundler, and more for JavaScript, TypeScript, JSON, HTML, Markdown, and CSS.]],
+ homepage = "https://rome.tools",
+ languages = { Pkg.Lang.TypeScript, Pkg.Lang.JavaScript },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.Linter },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ ctx.requested_version = ctx.requested_version:or_(function()
+ return Optional.of "10.0.7-nightly.2021.7.27"
+ end)
+ npm.install({ "rome", bin = { "rome" } }).with_receipt()
+ end,
+}
diff --git a/lua/mason/packages/rust-analyzer/init.lua b/lua/mason/packages/rust-analyzer/init.lua
new file mode 100644
index 00000000..0b966823
--- /dev/null
+++ b/lua/mason/packages/rust-analyzer/init.lua
@@ -0,0 +1,51 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "rust-analyzer",
+ desc = [[rust-analyzer is an implementation of Language Server Protocol for the Rust programming language. It provides features like completion and goto definition for many code editors, including VS Code, Emacs and Vim.]],
+ homepage = "https://rust-analyzer.github.io",
+ languages = { Pkg.Lang.Rust },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local libc = platform.get_libc()
+
+ local asset_file = coalesce(
+ when(platform.is.mac_arm64, "rust-analyzer-aarch64-apple-darwin.gz"),
+ when(platform.is.mac_x64, "rust-analyzer-x86_64-apple-darwin.gz"),
+ when(
+ platform.is.linux,
+ coalesce(
+ when(
+ libc == "glibc",
+ coalesce(
+ when(platform.arch == "arm64", "rust-analyzer-aarch64-unknown-linux-gnu.gz"),
+ when(platform.arch == "x64", "rust-analyzer-x86_64-unknown-linux-gnu.gz")
+ )
+ ),
+ when(
+ libc == "musl",
+ coalesce(when(platform.arch == "x64", "rust-analyzer-x86_64-unknown-linux-musl.gz"))
+ )
+ )
+ ),
+ when(platform.is.win_arm64, "rust-analyzer-aarch64-pc-windows-msvc.gz"),
+ when(platform.is.win_x64, "rust-analyzer-x86_64-pc-windows-msvc.gz")
+ )
+
+ github.gunzip_release_file({
+ repo = "rust-lang/rust-analyzer",
+ asset_file = asset_file,
+ out_file = platform.is.win and "rust-analyzer.exe" or "rust-analyzer",
+ }).with_receipt()
+ std.chmod("+x", { "rust-analyzer" })
+ ctx:link_bin("rust-analyzer", platform.is.win and "rust-analyzer.exe" or "rust-analyzer")
+ end,
+}
diff --git a/lua/mason/packages/salt-lsp/init.lua b/lua/mason/packages/salt-lsp/init.lua
new file mode 100644
index 00000000..3bb7d09c
--- /dev/null
+++ b/lua/mason/packages/salt-lsp/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "salt-lsp",
+ desc = [[Salt Language Server Protocol Server]],
+ languages = { Pkg.Lang.Salt },
+ categories = { Pkg.Cat.LSP },
+ homepage = "https://github.com/dcermak/salt-lsp",
+ install = pip3.packages { "salt-lsp", bin = { "salt_lsp_server" } },
+}
diff --git a/lua/mason/packages/serve-d/init.lua b/lua/mason/packages/serve-d/init.lua
new file mode 100644
index 00000000..6c10d311
--- /dev/null
+++ b/lua/mason/packages/serve-d/init.lua
@@ -0,0 +1,47 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "serve-d",
+ desc = [[Microsoft language server protocol implementation for D using workspace-d]],
+ homepage = "https://github.com/Pure-D/serve-d",
+ languages = { Pkg.Lang.D },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "Pure-D/serve-d"
+ platform.when {
+ unix = function()
+ github.untarxz_release_file({
+ repo = repo,
+ asset_file = function(release)
+ local target = coalesce(
+ when(platform.is.mac, "serve-d_%s-osx-x86_64.tar.xz"),
+ when(platform.is.linux_x64, "serve-d_%s-linux-x86_64.tar.xz")
+ )
+ return target and target:format(release:gsub("^v", ""))
+ end,
+ }).with_receipt()
+ ctx:link_bin("serve-d", "serve-d")
+ end,
+ win = function()
+ github.unzip_release_file({
+ repo = repo,
+ asset_file = function(release)
+ local target = coalesce(
+ when(platform.arch == "x64", "serve-d_%s-windows-x86_64.zip"),
+ when(platform.arch == "x86", "serve-d_%s-windows-x86.zip")
+ )
+ return target and target:format(release:gsub("^v", ""))
+ end,
+ }).with_receipt()
+ ctx:link_bin("serve-d", "serve-d.exe")
+ end,
+ }
+ end,
+}
diff --git a/lua/mason/packages/shellcheck/init.lua b/lua/mason/packages/shellcheck/init.lua
new file mode 100644
index 00000000..b05f3087
--- /dev/null
+++ b/lua/mason/packages/shellcheck/init.lua
@@ -0,0 +1,38 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local platform = require "mason.core.platform"
+
+return Pkg.new {
+ name = "shellcheck",
+ desc = [[ShellCheck, a static analysis tool for shell scripts]],
+ homepage = "https://www.shellcheck.net/",
+ categories = { Pkg.Cat.Linter },
+ languages = { Pkg.Lang.Bash },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ platform.when {
+ unix = function()
+ github.untarxz_release_file({
+ strip_components = 1,
+ repo = "koalaman/shellcheck",
+ asset_file = _.coalesce(
+ _.when(platform.is.mac, _.format "shellcheck-%s.darwin.x86_64.tar.xz"),
+ _.when(platform.is.linux_x64, _.format "shellcheck-%s.linux.x86_64.tar.xz"),
+ _.when(platform.is.linux_arm64, _.format "shellcheck-%s.linux.aarch64.tar.xz"),
+ _.when(platform.is.linux_arm, _.format "shellcheck-%s.linux.armv6hf.tar.xz")
+ ),
+ }).with_receipt()
+ ctx:link_bin("shellcheck", "shellcheck")
+ end,
+ win = function()
+ github.unzip_release_file({
+ repo = "koalaman/shellcheck",
+ asset_file = _.coalesce(_.when(platform.is.win_x64, _.format "shellcheck-%s.zip")),
+ }).with_receipt()
+ ctx:link_bin("shellcheck", "shellcheck.exe")
+ end,
+ }
+ end,
+}
diff --git a/lua/mason/packages/shopify-theme-check/init.lua b/lua/mason/packages/shopify-theme-check/init.lua
new file mode 100644
index 00000000..df945530
--- /dev/null
+++ b/lua/mason/packages/shopify-theme-check/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local gem = require "mason.core.managers.gem"
+
+return Pkg.new {
+ name = "shopify-theme-check",
+ desc = [[The Ultimate Shopify Theme Linter]],
+ homepage = "https://github.com/Shopify/theme-check",
+ languages = { Pkg.Lang.Liquid },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.Linter },
+ install = gem.packages { "theme-check", bin = { "theme-check-language-server" } },
+}
diff --git a/lua/mason/packages/slint-lsp/init.lua b/lua/mason/packages/slint-lsp/init.lua
new file mode 100644
index 00000000..ad9c53fa
--- /dev/null
+++ b/lua/mason/packages/slint-lsp/init.lua
@@ -0,0 +1,32 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+local path = require "mason.core.path"
+
+return Pkg.new {
+ name = "slint-lsp",
+ desc = [[A LSP Server that adds features like auto-complete and live preview of the .slint files to many editors.]],
+ homepage = "https://slint-ui.com/",
+ languages = { Pkg.Lang.Slint },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "slint-ui/slint"
+ platform.when {
+ win = function()
+ github.unzip_release_file({
+ repo = repo,
+ asset_file = "slint-lsp-windows.zip",
+ }).with_receipt()
+ end,
+ linux = function()
+ github.untargz_release_file({
+ repo = repo,
+ asset_file = "slint-lsp-linux.tar.gz",
+ }).with_receipt()
+ end,
+ }
+ ctx:link_bin("slint-lsp", path.concat { "slint-lsp", platform.is.win and "slint-lsp.exe" or "slint-lsp" })
+ end,
+}
diff --git a/lua/mason/packages/solang/init.lua b/lua/mason/packages/solang/init.lua
new file mode 100644
index 00000000..ebc7c089
--- /dev/null
+++ b/lua/mason/packages/solang/init.lua
@@ -0,0 +1,61 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local installer = require "mason.core.installer"
+local std = require "mason.core.managers.std"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+---@async
+local function download_solang()
+ local source = github.download_release_file({
+ repo = "hyperledger-labs/solang",
+ out_file = platform.is.win and "solang.exe" or "solang",
+ asset_file = coalesce(
+ when(platform.is.mac_x64, "solang-mac-intel"),
+ when(platform.is.mac_arm64, "solang-mac-arm"),
+ when(platform.is.linux_arm64, "solang-linux-arm64"),
+ when(platform.is.linux_x64, "solang-linux-x86-64"),
+ when(platform.is.win_x64, "solang.exe")
+ ),
+ }).with_receipt()
+ std.chmod("+x", { "solang" })
+ return source
+end
+
+---@async
+---Solang needs a build of llvm with some extra patches.
+local function download_llvm()
+ local source = github.release_file {
+ repo = "hyperledger-labs/solang",
+ asset_file = coalesce(
+ when(platform.is.mac_x64, "llvm13.0-mac-intel.tar.xz"),
+ when(platform.is.mac_arm64, "llvm13.0-mac-arm.tar.xz"),
+ when(platform.is.linux_x64, "llvm13.0-linux-x86-64.tar.xz"),
+ when(platform.is.linux_arm64, "llvm13.0-linux-arm64.tar.xz"),
+ when(platform.is.win_x64, "llvm13.0-win.zip")
+ ),
+ }
+ if platform.is.win then
+ std.download_file(source.download_url, "llvm.zip")
+ std.unzip("llvm.zip", ".")
+ else
+ std.download_file(source.download_url, "llvm.tar.xz")
+ std.untar "llvm.tar.xz"
+ end
+end
+
+return Pkg.new {
+ name = "solang",
+ desc = [[Solidity Compiler for Solana, Substrate, and ewasm]],
+ homepage = "https://solang.readthedocs.io/en/latest/",
+ languages = { Pkg.Lang.Solidity },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.Compiler },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ installer.run_concurrently { download_solang, download_llvm }
+ ctx:link_bin("solang", platform.is.win and "solang.exe" or "solang")
+ end,
+}
diff --git a/lua/mason/packages/solargraph/init.lua b/lua/mason/packages/solargraph/init.lua
new file mode 100644
index 00000000..88bf3c19
--- /dev/null
+++ b/lua/mason/packages/solargraph/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local gem = require "mason.core.managers.gem"
+
+return Pkg.new {
+ name = "solargraph",
+ desc = [[Solargraph is a Ruby gem that provides intellisense features through the language server protocol.]],
+ homepage = "https://solargraph.org",
+ languages = { Pkg.Lang.Ruby },
+ categories = { Pkg.Cat.LSP },
+ install = gem.packages { "solargraph", bin = { "solargraph" } },
+}
diff --git a/lua/mason/packages/solidity/init.lua b/lua/mason/packages/solidity/init.lua
new file mode 100644
index 00000000..e7379c9f
--- /dev/null
+++ b/lua/mason/packages/solidity/init.lua
@@ -0,0 +1,30 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "solidity",
+ desc = [[Solidity, the Smart Contract Programming Language]],
+ homepage = "https://github.com/ethereum/solidity",
+ categories = { Pkg.Cat.Compiler, Pkg.Cat.LSP },
+ languages = { Pkg.Lang.Solidity },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.download_release_file({
+ repo = "ethereum/solidity",
+ out_file = platform.is_win and "solc.exe" or "solc",
+ asset_file = coalesce(
+ when(platform.is.mac, "solc-macos"),
+ when(platform.is.linux, "solc-static-linux"),
+ when(platform.is.win, "solc-windows.exe")
+ ),
+ }).with_receipt()
+ std.chmod("+x", { "solc" })
+ ctx:link_bin("solc", platform.is.win and "solc.exe" or "solc")
+ end,
+}
diff --git a/lua/mason/packages/sorbet/init.lua b/lua/mason/packages/sorbet/init.lua
new file mode 100644
index 00000000..d013bb82
--- /dev/null
+++ b/lua/mason/packages/sorbet/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local gem = require "mason.core.managers.gem"
+
+return Pkg.new {
+ name = "sorbet",
+ desc = [[Sorbet is a fast, powerful type checker designed for Ruby.]],
+ homepage = "https://sorbet.org/",
+ languages = { Pkg.Lang.Ruby },
+ categories = { Pkg.Cat.LSP },
+ install = gem.packages { "sorbet", bin = { "srb" } },
+}
diff --git a/lua/mason/packages/sourcery/init.lua b/lua/mason/packages/sourcery/init.lua
new file mode 100644
index 00000000..c0085044
--- /dev/null
+++ b/lua/mason/packages/sourcery/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local pip3 = require "mason.core.managers.pip3"
+
+return Pkg.new {
+ name = "sourcery",
+ desc = [[Sourcery is a tool available in your IDE, GitHub, or as a CLI that suggests refactoring improvements to help make your code more readable and generally higher quality.]],
+ homepage = "https://docs.sourcery.ai/",
+ languages = { Pkg.Lang.Python },
+ categories = { Pkg.Cat.LSP },
+ install = pip3.packages { "sourcery-cli", bin = { "sourcery" } },
+}
diff --git a/lua/mason/packages/sqlls/init.lua b/lua/mason/packages/sqlls/init.lua
new file mode 100644
index 00000000..f954bce8
--- /dev/null
+++ b/lua/mason/packages/sqlls/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "sqlls",
+ desc = [[SQL Language Server]],
+ homepage = "https://github.com/joe-re/sql-language-server",
+ languages = { Pkg.Lang.SQL },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "sql-language-server", bin = { "sql-language-server" } },
+}
diff --git a/lua/mason/packages/sqls/init.lua b/lua/mason/packages/sqls/init.lua
new file mode 100644
index 00000000..e22ab013
--- /dev/null
+++ b/lua/mason/packages/sqls/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local go = require "mason.core.managers.go"
+
+return Pkg.new {
+ name = "sqls",
+ desc = [[SQL language server written in Go.]],
+ homepage = "https://github.com/lighttiger2505/sqls",
+ languages = { Pkg.Lang.SQL },
+ categories = { Pkg.Cat.LSP },
+ install = go.packages { "github.com/lighttiger2505/sqls", bin = { "sqls" } },
+}
diff --git a/lua/mason/packages/stylelint-lsp/init.lua b/lua/mason/packages/stylelint-lsp/init.lua
new file mode 100644
index 00000000..95420625
--- /dev/null
+++ b/lua/mason/packages/stylelint-lsp/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "stylelint-lsp",
+ desc = [[A stylelint Language Server]],
+ homepage = "https://github.com/bmatcuk/stylelint-lsp",
+ languages = { Pkg.Lang.Stylelint },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "stylelint-lsp", bin = { "stylelint-lsp" } },
+}
diff --git a/lua/mason/packages/stylua/init.lua b/lua/mason/packages/stylua/init.lua
new file mode 100644
index 00000000..c421f4af
--- /dev/null
+++ b/lua/mason/packages/stylua/init.lua
@@ -0,0 +1,13 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "stylua",
+ desc = [[An opinionated Lua code formatter]],
+ homepage = "https://github.com/JohnnyMorganz/StyLua",
+ languages = { Pkg.Lang.Lua },
+ categories = { Pkg.Cat.Formatter },
+ install = cargo.crate("stylua", {
+ bin = { "stylua" }
+ }),
+}
diff --git a/lua/mason/packages/svelte-language-server/init.lua b/lua/mason/packages/svelte-language-server/init.lua
new file mode 100644
index 00000000..763c1b36
--- /dev/null
+++ b/lua/mason/packages/svelte-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "svelte-language-server",
+ desc = [[A language server (implementing the language server protocol) for Svelte.]],
+ languages = { Pkg.Lang.Svelte },
+ categories = { Pkg.Cat.LSP },
+ homepage = "https://github.com/sveltejs/language-tools",
+ install = npm.packages { "svelte-language-server", bin = { "svelteserver" } },
+}
diff --git a/lua/mason/packages/svlangserver/init.lua b/lua/mason/packages/svlangserver/init.lua
new file mode 100644
index 00000000..2ed6888c
--- /dev/null
+++ b/lua/mason/packages/svlangserver/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "svlangserver",
+ desc = [[A language server for systemverilog that has been tested to work with coc.nvim, VSCode, Sublime Text 4, emacs, and Neovim]],
+ homepage = "https://github.com/imc-trading/svlangserver",
+ languages = { Pkg.Lang.SystemVerilog },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@imc-trading/svlangserver", bin = { "svlangserver" } },
+}
diff --git a/lua/mason/packages/svls/init.lua b/lua/mason/packages/svls/init.lua
new file mode 100644
index 00000000..f7b8088c
--- /dev/null
+++ b/lua/mason/packages/svls/init.lua
@@ -0,0 +1,13 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "svls",
+ desc = [[SystemVerilog language server]],
+ homepage = "https://github.com/dalance/svls",
+ languages = { Pkg.Lang.SystemVerilog },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("svls", {
+ bin = { "svls" },
+ }),
+}
diff --git a/lua/mason/packages/tailwindcss-language-server/init.lua b/lua/mason/packages/tailwindcss-language-server/init.lua
new file mode 100644
index 00000000..d074ba84
--- /dev/null
+++ b/lua/mason/packages/tailwindcss-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "tailwindcss-language-server",
+ desc = [[Language Server Protocol implementation for Tailwind CSS.]],
+ homepage = "https://github.com/tailwindlabs/tailwindcss-intellisense",
+ languages = { Pkg.Lang.CSS },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@tailwindcss/language-server", bin = { "tailwindcss-language-server" } },
+}
diff --git a/lua/mason/packages/taplo/init.lua b/lua/mason/packages/taplo/init.lua
new file mode 100644
index 00000000..4909aec5
--- /dev/null
+++ b/lua/mason/packages/taplo/init.lua
@@ -0,0 +1,14 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+return Pkg.new {
+ name = "taplo",
+ desc = [[A versatile, feature-rich TOML toolkit.]],
+ homepage = "https://taplo.tamasfe.dev/",
+ languages = { Pkg.Lang.TOML },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("taplo-cli", {
+ features = "lsp",
+ bin = { "taplo" },
+ }),
+}
diff --git a/lua/mason/packages/teal-language-server/init.lua b/lua/mason/packages/teal-language-server/init.lua
new file mode 100644
index 00000000..3911869f
--- /dev/null
+++ b/lua/mason/packages/teal-language-server/init.lua
@@ -0,0 +1,14 @@
+local Pkg = require "mason.core.package"
+local luarocks = require "mason.core.managers.luarocks"
+
+return Pkg.new {
+ name = "teal-language-server",
+ desc = [[A language server for Teal, a typed dialect of Lua]],
+ homepage = "https://github.com/teal-language/teal-language-server",
+ languages = { Pkg.Lang.Teal },
+ categories = { Pkg.Cat.LSP },
+ install = luarocks.package("teal-language-server", {
+ dev = true,
+ bin = { "teal-language-server" },
+ }),
+}
diff --git a/lua/mason/packages/terraform-ls/init.lua b/lua/mason/packages/terraform-ls/init.lua
new file mode 100644
index 00000000..85e7f4a8
--- /dev/null
+++ b/lua/mason/packages/terraform-ls/init.lua
@@ -0,0 +1,33 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "terraform-ls",
+ desc = [[Terraform Language Server]],
+ homepage = "https://github.com/hashicorp/terraform-ls",
+ languages = { Pkg.Lang.Terraform },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "hashicorp/terraform-ls",
+ asset_file = function(version)
+ local target = coalesce(
+ when(platform.is.mac_arm64, "terraform-ls_%s_darwin_arm64.zip"),
+ when(platform.is.mac_x64, "terraform-ls_%s_darwin_amd64.zip"),
+ when(platform.is.linux_arm64, "terraform-ls_%s_linux_arm64.zip"),
+ when(platform.is.linux_arm, "terraform-ls_%s_linux_arm.zip"),
+ when(platform.is.linux_x64, "terraform-ls_%s_linux_amd64.zip"),
+ when(platform.is.win_x64, "terraform-ls_%s_windows_amd64.zip")
+ )
+ return target and target:format(version:gsub("^v", ""))
+ end,
+ }).with_receipt()
+ ctx:link_bin("terraform-ls", platform.is.win and "terraform-ls.exe" or "terraform-ls")
+ end,
+}
diff --git a/lua/mason/packages/texlab/init.lua b/lua/mason/packages/texlab/init.lua
new file mode 100644
index 00000000..dfb4f3d0
--- /dev/null
+++ b/lua/mason/packages/texlab/init.lua
@@ -0,0 +1,39 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "texlab",
+ desc = [[An implementation of the Language Server Protocol for LaTeX]],
+ homepage = "https://github.com/latex-lsp/texlab",
+ categories = { Pkg.Cat.LSP },
+ languages = { Pkg.Lang.LaTeX },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "latex-lsp/texlab"
+ platform.when {
+ unix = function()
+ github.untargz_release_file({
+ repo = repo,
+ asset_file = coalesce(
+ when(platform.is.mac_arm64, "texlab-aarch64-macos.tar.gz"),
+ when(platform.is.mac_x64, "texlab-x86_64-macos.tar.gz"),
+ when(platform.is.linux_x64, "texlab-x86_64-linux.tar.gz")
+ ),
+ }).with_receipt()
+ ctx:link_bin("texlab", "texlab")
+ end,
+ win = function()
+ github.unzip_release_file({
+ repo = repo,
+ asset_file = coalesce(when(platform.arch == "x64", "texlab-x86_64-windows.zip")),
+ }).with_receipt()
+ ctx:link_bin("texlab", "texlab.exe")
+ end,
+ }
+ end,
+}
diff --git a/lua/mason/packages/tflint/init.lua b/lua/mason/packages/tflint/init.lua
new file mode 100644
index 00000000..3206e576
--- /dev/null
+++ b/lua/mason/packages/tflint/init.lua
@@ -0,0 +1,30 @@
+local Pkg = require "mason.core.package"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "tflint",
+ desc = [[A Pluggable Terraform Linter]],
+ homepage = "https://github.com/terraform-linters/tflint",
+ languages = { Pkg.Lang.Terraform },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.Linter },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ github.unzip_release_file({
+ repo = "terraform-linters/tflint",
+ asset_file = coalesce(
+ when(platform.is.mac_x64, "tflint_darwin_amd64.zip"),
+ when(platform.is.mac_arm64, "tflint_darwin_arm64.zip"),
+ when(platform.is.linux_x64, "tflint_linux_amd64.zip"),
+ when(platform.is.linux_arm64, "tflint_linux_arm64.zip"),
+ when(platform.is.linux_x86, "tflint_linux_386.zip"),
+ when(platform.is.win_x64, "tflint_windows_amd64.zip")
+ ),
+ }).with_receipt()
+ ctx:link_bin("tflint", platform.is.win and "tflint.exe" or "tflint")
+ end,
+}
diff --git a/lua/mason/packages/typescript-language-server/init.lua b/lua/mason/packages/typescript-language-server/init.lua
new file mode 100644
index 00000000..f6bf3faa
--- /dev/null
+++ b/lua/mason/packages/typescript-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "typescript-language-server",
+ desc = [[TypeScript & JavaScript Language Server]],
+ homepage = "https://github.com/typescript-language-server/typescript-language-server",
+ categories = { Pkg.Cat.LSP },
+ languages = { Pkg.Lang.TypeScript, Pkg.Lang.JavaScript },
+ install = npm.packages { "typescript-language-server", "typescript", bin = { "typescript-language-server" } },
+}
diff --git a/lua/mason/packages/vala-language-server/init.lua b/lua/mason/packages/vala-language-server/init.lua
new file mode 100644
index 00000000..65ea9e61
--- /dev/null
+++ b/lua/mason/packages/vala-language-server/init.lua
@@ -0,0 +1,40 @@
+local Pkg = require "mason.core.package"
+local std = require "mason.core.managers.std"
+local github = require "mason.core.managers.github"
+local platform = require "mason.core.platform"
+local path = require "mason.core.path"
+
+return Pkg.new {
+ name = "vala-language-server",
+ desc = [[Code Intelligence for Vala & Genie]],
+ homepage = "https://github.com/vala-lang/vala-language-server",
+ languages = { Pkg.Lang.Vala },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ std.ensure_executable("meson", { help_url = "https://mesonbuild.com/Getting-meson.html" })
+ std.ensure_executable("ninja", { help_url = "https://ninja-build.org/" })
+ std.ensure_executable("valac", { help_url = "https://wiki.gnome.org/Projects/Vala" })
+
+ local release_source = github.untarxz_release_file {
+ repo = "vala-lang/vala-language-server",
+ asset_file = function(version)
+ return ("vala-language-server-%s.tar.xz"):format(version)
+ end,
+ }
+ release_source.with_receipt()
+
+ local vala_dirname = ("vala-language-server-%s"):format(release_source.release)
+ local install_dir = ctx.cwd:get()
+ ctx:chdir(vala_dirname, function()
+ ctx.spawn.meson { ("-Dprefix=%s"):format(install_dir), "build" }
+ ctx.spawn.ninja { "-C", "build", "install" }
+ end)
+ ctx.fs:rmrf(vala_dirname)
+ ctx:link_bin(
+ "vala-language-server",
+ path.concat { "bin", platform.is.win and "vala-language-server.exe" or "vala-language-server" }
+ )
+ end,
+}
diff --git a/lua/mason/packages/verible/init.lua b/lua/mason/packages/verible/init.lua
new file mode 100644
index 00000000..a681c4f7
--- /dev/null
+++ b/lua/mason/packages/verible/init.lua
@@ -0,0 +1,85 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local path = require "mason.core.path"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "verible",
+ desc = [[Verible is a suite of SystemVerilog developer tools, including a parser, style-linter, and formatter.]],
+ homepage = "https://chipsalliance.github.io/verible/",
+ languages = { Pkg.Lang.SystemVerilog },
+ categories = { Pkg.Cat.LSP, Pkg.Cat.Linter, Pkg.Cat.Formatter },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "chipsalliance/verible"
+ platform.when {
+ linux = function()
+ local os_dist = platform.os_distribution()
+ local source = github.untarxz_release_file {
+ repo = repo,
+ asset_file = function(release)
+ if os_dist.id == "ubuntu" then
+ local target_file = when(
+ platform.arch == "x64",
+ coalesce(
+ when(os_dist.version.major == 16, "verible-%s-Ubuntu-16.04-xenial-x86_64.tar.gz"),
+ when(os_dist.version.major == 18, "verible-%s-Ubuntu-18.04-bionic-x86_64.tar.gz"),
+ when(os_dist.version.major == 20, "verible-%s-Ubuntu-20.04-focal-x86_64.tar.gz"),
+ when(os_dist.version.major == 22, "verible-%s-Ubuntu-22.04-jammy-x86_64.tar.gz")
+ )
+ )
+ return target_file and target_file:format(release)
+ end
+ end,
+ }
+ source.with_receipt()
+ ctx.fs:rename(("verible-%s"):format(source.release), "verible")
+ for executable, rel_path in pairs {
+ ["git-verible-verilog-format.sh"] = { "verible", "bin", "git-verible-verilog-format.sh" },
+ ["verible-patch-tool"] = { "verible", "bin", "verible-patch-tool" },
+ ["verible-transform-interactive.sh"] = { "verible", "bin", "verible-transform-interactive.sh" },
+ ["verible-verilog-diff"] = { "verible", "bin", "verible-verilog-ls" },
+ ["verible-verilog-format"] = { "verible", "bin", "verible-verilog-format" },
+ ["verible-verilog-kythe-extractor"] = { "verible", "bin", "verible-verilog-kythe-extractor" },
+ ["verible-verilog-lint"] = { "verible", "bin", "verible-verilog-lint" },
+ ["verible-verilog-ls"] = { "verible", "bin", "verible-verilog-ls" },
+ ["verible-verilog-obfuscate"] = { "verible", "bin", "verible-verilog-obfuscate" },
+ ["verible-verilog-preprocessor"] = { "verible", "bin", "verible-verilog-preprocessor" },
+ ["verible-verilog-project"] = { "verible", "bin", "verible-verilog-project" },
+ ["verible-verilog-syntax"] = { "verible", "bin", "verible-verilog-syntax" },
+ } do
+ ctx:link_bin(executable, path.concat(rel_path))
+ end
+ end,
+ win = function()
+ local source = github.unzip_release_file {
+ repo = repo,
+ asset_file = function(release)
+ local target_file = coalesce(when(platform.arch == "x64", "verible-%s-win64.zip"))
+ return target_file and target_file:format(release)
+ end,
+ }
+ source.with_receipt()
+ ctx.fs:rename(("verible-%s-win64"):format(source.release), "verible")
+ for executable, rel_path in pairs {
+ ["verible-patch-tool"] = { "verible", "verible-patch-tool.exe" },
+ ["verible-verilog-diff"] = { "verible", "verible-verilog-ls.exe" },
+ ["verible-verilog-format"] = { "verible", "verible-verilog-format.exe" },
+ ["verible-verilog-kythe-extractor"] = { "verible", "verible-verilog-kythe-extractor.exe" },
+ ["verible-verilog-lint"] = { "verible", "verible-verilog-lint.exe" },
+ ["verible-verilog-ls"] = { "verible", "verible-verilog-ls.exe" },
+ ["verible-verilog-obfuscate"] = { "verible", "verible-verilog-obfuscate.exe" },
+ ["verible-verilog-preprocessor"] = { "verible", "verible-verilog-preprocessor.exe" },
+ ["verible-verilog-project"] = { "verible", "verible-verilog-project.exe" },
+ ["verible-verilog-syntax"] = { "verible", "verible-verilog-syntax.exe" },
+ } do
+ ctx:link_bin(executable, path.concat(rel_path))
+ end
+ end,
+ }
+ end,
+}
diff --git a/lua/mason/packages/vetur-vls/init.lua b/lua/mason/packages/vetur-vls/init.lua
new file mode 100644
index 00000000..07503fad
--- /dev/null
+++ b/lua/mason/packages/vetur-vls/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "vetur-vls",
+ desc = [[VLS (Vue Language Server) is a language server implementation compatible with Language Server Protocol.]],
+ homepage = "https://github.com/vuejs/vetur",
+ languages = { Pkg.Lang.Vue },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "vls", bin = { "vls" } },
+}
diff --git a/lua/mason/packages/vim-language-server/init.lua b/lua/mason/packages/vim-language-server/init.lua
new file mode 100644
index 00000000..7e555644
--- /dev/null
+++ b/lua/mason/packages/vim-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "vim-language-server",
+ desc = [[VimScript language server.]],
+ homepage = "https://github.com/iamcco/vim-language-server",
+ languages = { Pkg.Lang.VimScript },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "vim-language-server", bin = { "vim-language-server" } },
+}
diff --git a/lua/mason/packages/visualforce-language-server/init.lua b/lua/mason/packages/visualforce-language-server/init.lua
new file mode 100644
index 00000000..f3581b5d
--- /dev/null
+++ b/lua/mason/packages/visualforce-language-server/init.lua
@@ -0,0 +1,32 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local github_client = require "mason.core.managers.github.client"
+local Optional = require "mason.core.optional"
+local _ = require "mason.core.functional"
+
+return Pkg.new {
+ name = "visualforce-language-server",
+ desc = [[Visualforce language server]],
+ homepage = "https://github.com/forcedotcom/salesforcedx-vscode",
+ languages = { Pkg.Lang.Visualforce },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ install = function()
+ local repo = "forcedotcom/salesforcedx-vscode"
+
+ -- See https://github.com/forcedotcom/salesforcedx-vscode/issues/4184#issuecomment-1146052086
+ ---@type GitHubRelease
+ local release = github_client
+ .fetch_releases(repo)
+ :map(_.find_first(_.prop_satisfies(_.compose(_.gt(0), _.length), "assets")))
+ :map(Optional.of_nilable)
+ :get_or_throw() -- Result unwrap
+ :or_else_throw "Failed to find release with assets." -- Optional unwrap
+
+ github.unzip_release_file({
+ version = Optional.of(release.tag_name),
+ asset_file = _.compose(_.format "salesforcedx-vscode-visualforce-%s.vsix", _.gsub("^v", "")),
+ repo = repo,
+ }).with_receipt()
+ end,
+}
diff --git a/lua/mason/packages/vls/init.lua b/lua/mason/packages/vls/init.lua
new file mode 100644
index 00000000..81cf7478
--- /dev/null
+++ b/lua/mason/packages/vls/init.lua
@@ -0,0 +1,36 @@
+local Pkg = require "mason.core.package"
+local github = require "mason.core.managers.github"
+local github_client = require "mason.core.managers.github.client"
+local std = require "mason.core.managers.std"
+local _ = require "mason.core.functional"
+local platform = require "mason.core.platform"
+local Optional = require "mason.core.optional"
+
+return Pkg.new {
+ name = "vls",
+ desc = [[V language server]],
+ homepage = "https://github.com/vlang/vls",
+ languages = { Pkg.Lang.V },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "vlang/vls"
+
+ ---@type GitHubRelease
+ local latest_dev_build = github_client.fetch_latest_release(repo, { include_prerelease = true }):get_or_throw()
+
+ github.download_release_file({
+ version = Optional.of(latest_dev_build.tag_name),
+ repo = repo,
+ out_file = platform.is.win and "vls.exe" or "vls",
+ asset_file = _.coalesce(
+ _.when(platform.is.linux_x64, "vls_linux_x64"),
+ _.when(platform.is.mac, "vls_macos_x64"),
+ _.when(platform.is.win_x64, "vls_windows_x64.exe")
+ ),
+ }).with_receipt()
+ std.chmod("+x", { "vls" })
+ ctx:link_bin("vls", platform.is.win and "vls.exe" or "vls")
+ end,
+}
diff --git a/lua/mason/packages/vue-language-server/init.lua b/lua/mason/packages/vue-language-server/init.lua
new file mode 100644
index 00000000..3c3b181a
--- /dev/null
+++ b/lua/mason/packages/vue-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "vue-language-server",
+ desc = [[⚡ Explore high-performance tooling for Vue]],
+ homepage = "https://github.com/johnsoncodehk/volar",
+ languages = { Pkg.Lang.Vue },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "@volar/vue-language-server", "typescript", bin = { "vue-language-server" } },
+}
diff --git a/lua/mason/packages/wgsl-analyzer/init.lua b/lua/mason/packages/wgsl-analyzer/init.lua
new file mode 100644
index 00000000..68dc25ad
--- /dev/null
+++ b/lua/mason/packages/wgsl-analyzer/init.lua
@@ -0,0 +1,16 @@
+local Pkg = require "mason.core.package"
+local cargo = require "mason.core.managers.cargo"
+
+local github_url = "https://github.com/wgsl-analyzer/wgsl-analyzer"
+
+return Pkg.new {
+ name = "wgsl-analyzer",
+ desc = [[A language server implementation for the WGSL shading language]],
+ homepage = github_url,
+ languages = { Pkg.Lang.WGSL },
+ categories = { Pkg.Cat.LSP },
+ install = cargo.crate("wgsl_analyzer", {
+ git = github_url,
+ bin = { "wgsl_analyzer" },
+ }),
+}
diff --git a/lua/mason/packages/yaml-language-server/init.lua b/lua/mason/packages/yaml-language-server/init.lua
new file mode 100644
index 00000000..4bf15a76
--- /dev/null
+++ b/lua/mason/packages/yaml-language-server/init.lua
@@ -0,0 +1,11 @@
+local Pkg = require "mason.core.package"
+local npm = require "mason.core.managers.npm"
+
+return Pkg.new {
+ name = "yaml-language-server",
+ desc = [[Language Server for YAML Files]],
+ homepage = "https://github.com/redhat-developer/yaml-language-server",
+ languages = { Pkg.Lang.YAML },
+ categories = { Pkg.Cat.LSP },
+ install = npm.packages { "yaml-language-server", bin = { "yaml-language-server" } },
+}
diff --git a/lua/mason/packages/zk/init.lua b/lua/mason/packages/zk/init.lua
new file mode 100644
index 00000000..dc0cab0a
--- /dev/null
+++ b/lua/mason/packages/zk/init.lua
@@ -0,0 +1,51 @@
+local Pkg = require "mason.core.package"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "zk",
+ desc = [[A plain text note-taking assistant]],
+ homepage = "https://github.com/mickael-menu/zk",
+ languages = { Pkg.Lang.Markdown },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local repo = "mickael-menu/zk"
+ platform.when {
+ mac = function()
+ github.unzip_release_file({
+ repo = repo,
+ asset_file = coalesce(
+ when(platform.arch == "arm64", function(version)
+ return ("zk-%s-macos-arm64.zip"):format(version)
+ end),
+ when(platform.arch == "x64", function(version)
+ return ("zk-%s-macos-x86_64.zip"):format(version)
+ end)
+ ),
+ }):with_receipt()
+ end,
+ linux = function()
+ github.untargz_release_file({
+ repo = repo,
+ asset_file = coalesce(
+ when(platform.arch == "arm64", function(version)
+ return ("zk-%s-linux-arm64.tar.gz"):format(version)
+ end),
+ when(platform.arch == "x64", function(version)
+ return ("zk-%s-linux-amd64.tar.gz"):format(version)
+ end),
+ when(platform.arch == "x86", function(version)
+ return ("zk-%s-linux-i386.tar.gz"):format(version)
+ end)
+ ),
+ }).with_receipt()
+ end,
+ }
+ ctx:link_bin("zk", "zk")
+ end,
+}
diff --git a/lua/mason/packages/zls/init.lua b/lua/mason/packages/zls/init.lua
new file mode 100644
index 00000000..6a150911
--- /dev/null
+++ b/lua/mason/packages/zls/init.lua
@@ -0,0 +1,32 @@
+local Pkg = require "mason.core.package"
+local path = require "mason.core.path"
+local platform = require "mason.core.platform"
+local _ = require "mason.core.functional"
+local github = require "mason.core.managers.github"
+local std = require "mason.core.managers.std"
+
+local coalesce, when = _.coalesce, _.when
+
+return Pkg.new {
+ name = "zls",
+ desc = [[Zig LSP implementation + Zig Language Server]],
+ homepage = "https://github.com/zigtools/zls",
+ languages = { Pkg.Lang.Zig },
+ categories = { Pkg.Cat.LSP },
+ ---@async
+ ---@param ctx InstallContext
+ install = function(ctx)
+ local asset_file = coalesce(
+ when(platform.is.mac, "x86_64-macos.tar.xz"),
+ when(platform.is.linux_x64, "x86_64-linux.tar.xz"),
+ when(platform.is.linux_x86, "i386-linux.tar.xz"),
+ when(platform.is.win_x64, "x86_64-windows.tar.xz")
+ )
+ github.untarxz_release_file({
+ repo = "zigtools/zls",
+ asset_file = asset_file,
+ }).with_receipt()
+ std.chmod("+x", { path.concat { "bin", "zls" } })
+ ctx:link_bin("zls", path.concat { "bin", platform.is.win and "zls.exe" or "zls" })
+ end,
+}
diff --git a/lua/mason/settings.lua b/lua/mason/settings.lua
new file mode 100644
index 00000000..bfa7fd9f
--- /dev/null
+++ b/lua/mason/settings.lua
@@ -0,0 +1,79 @@
+local path = require "mason.core.path"
+
+local M = {}
+
+---@class MasonSettings
+local DEFAULT_SETTINGS = {
+ ui = {
+ -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|.
+ border = "none",
+
+ icons = {
+ -- The list icon to use for installed packages.
+ package_installed = "◍",
+ -- The list icon to use for packages that are installing, or queued for installation.
+ package_pending = "◍",
+ -- The list icon to use for packages that are not installed.
+ package_uninstalled = "◍",
+ },
+
+ keymaps = {
+ -- Keymap to expand a package
+ toggle_package_expand = "<CR>",
+ -- Keymap to install the package under the current cursor position
+ install_package = "i",
+ -- Keymap to reinstall/update the package under the current cursor position
+ update_package = "u",
+ -- Keymap to check for new version for the package under the current cursor position
+ check_package_version = "c",
+ -- Keymap to update all installed packages
+ update_all_packages = "U",
+ -- Keymap to check which installed packages are outdated
+ check_outdated_packages = "C",
+ -- Keymap to uninstall a package
+ uninstall_package = "X",
+ -- Keymap to cancel a package installation
+ cancel_installation = "<C-c>",
+ -- Keymap to apply language filter
+ apply_language_filter = "<C-f>",
+ },
+ },
+
+ -- The directory in which to install packages.
+ install_root_dir = path.concat { vim.fn.stdpath "data", "mason" },
+
+ pip = {
+ -- These args will be added to `pip install` calls. Note that setting extra args might impact intended behavior
+ -- and is not recommended.
+ --
+ -- Example: { "--proxy", "https://proxyserver" }
+ install_args = {},
+ },
+
+ -- Controls to which degree logs are written to the log file. It's useful to set this to vim.log.levels.DEBUG when
+ -- debugging issues with server installations.
+ log_level = vim.log.levels.INFO,
+
+ -- Limit for the maximum amount of servers to be installed at the same time. Once this limit is reached, any further
+ -- servers that are requested to be installed will be put in a queue.
+ max_concurrent_installers = 4,
+
+ github = {
+ -- The template URL to use when downloading assets from GitHub.
+ -- The placeholders are the following (in order):
+ -- 1. The repository (e.g. "rust-lang/rust-analyzer")
+ -- 2. The release version (e.g. "v0.3.0")
+ -- 3. The asset name (e.g. "rust-analyzer-v0.3.0-x86_64-unknown-linux-gnu.tar.gz")
+ download_url_template = "https://github.com/%s/releases/download/%s/%s",
+ },
+}
+
+M._DEFAULT_SETTINGS = DEFAULT_SETTINGS
+M.current = M._DEFAULT_SETTINGS
+
+---@param opts MasonSettings
+function M.set(opts)
+ M.current = vim.tbl_deep_extend("force", M.current, opts)
+end
+
+return M
diff --git a/lua/mason/ui/components/footer.lua b/lua/mason/ui/components/footer.lua
new file mode 100644
index 00000000..dfc4ba20
--- /dev/null
+++ b/lua/mason/ui/components/footer.lua
@@ -0,0 +1,17 @@
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+
+---@param state InstallerUiState
+return function(state)
+ if not state.stats.used_disk_space then
+ return Ui.Node {}
+ end
+ return Ui.CascadingStyleNode({ "CENTERED" }, {
+ Ui.Table {
+ {
+ p.muted "Used disk space:",
+ p.none(state.stats.used_disk_space),
+ },
+ },
+ })
+end
diff --git a/lua/mason/ui/components/header.lua b/lua/mason/ui/components/header.lua
new file mode 100644
index 00000000..07ea20cf
--- /dev/null
+++ b/lua/mason/ui/components/header.lua
@@ -0,0 +1,22 @@
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+
+---@param state InstallerUiState
+return function(state)
+ return Ui.CascadingStyleNode({ "CENTERED" }, {
+ Ui.HlTextNode {
+ Ui.When(state.view.is_showing_help, {
+ p.header_secondary(" " .. state.header.title_prefix .. " mason.nvim "),
+ p.none((" "):rep(#state.header.title_prefix + 1)),
+ }, {
+ p.header " mason.nvim ",
+ }),
+ Ui.When(
+ state.view.is_showing_help,
+ { p.none " press ", p.highlight_secondary "?", p.none " for package list" },
+ { p.none "press ", p.highlight "?", p.none " for help" }
+ ),
+ { p.Comment "https://github.com/williamboman/mason.nvim" },
+ },
+ })
+end
diff --git a/lua/mason/ui/components/help/dap.lua b/lua/mason/ui/components/help/dap.lua
new file mode 100644
index 00000000..ba8cbe13
--- /dev/null
+++ b/lua/mason/ui/components/help/dap.lua
@@ -0,0 +1,20 @@
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+
+---@param state InstallerUiState
+return function(state)
+ return Ui.HlTextNode {
+ {
+ p.none "The ",
+ p.highlight_secondary "D",
+ p.none "ebugger ",
+ p.highlight_secondary "A",
+ p.none "dapter ",
+ p.highlight_secondary "P",
+ p.none "rotocol defines the abstract protocol used",
+ },
+ {
+ p.none "between a development tool (e.g. IDE or editor) and a debugger.",
+ },
+ }
+end
diff --git a/lua/mason/ui/components/help/init.lua b/lua/mason/ui/components/help/init.lua
new file mode 100644
index 00000000..97fa1552
--- /dev/null
+++ b/lua/mason/ui/components/help/init.lua
@@ -0,0 +1,153 @@
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+local _ = require "mason.core.functional"
+local settings = require "mason.settings"
+local log = require "mason.log"
+
+local LSPHelp = require "mason.ui.components.help.lsp"
+local DAPHelp = require "mason.ui.components.help.dap"
+
+---@param state InstallerUiState
+local function Ship(state)
+ local ship_indent = { (" "):rep(state.view.ship_indentation), "" }
+ -- stylua: ignore start
+ local ship = {
+ { ship_indent, p.muted "/^v^\\", p.none " | | |" },
+ { ship_indent, p.none " )_) )_) )_) ", p.muted "/^v^\\" },
+ { ship_indent, p.muted " ", p.muted "/^v^\\", p.none " )___))___))___)\\ ", p.highlight_secondary(state.view.ship_exclamation) },
+ { ship_indent, p.none " )____)____)_____)\\\\" },
+ { ship_indent, p.none " _____|____|____|____\\\\\\__" },
+ { ship_indent, p.muted " ", p.none "\\ /" },
+ }
+ -- stylua: ignore end
+ local water = {
+ { p.highlight " ^^^^^ ^^^^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^ <>< " },
+ { p.highlight " ^^^^ ^^ ^^^ ^ ^^^ ^^^ <>< ^^^^ " },
+ { p.highlight " ><> ^^^ ^^ ><> ^^ ^^ ^ " },
+ }
+ if state.view.ship_indentation < 0 then
+ for _, shipline in ipairs(ship) do
+ local removed_chars = 0
+ for _, span in ipairs(shipline) do
+ local span_length = #span[1]
+ local chars_to_remove = (math.abs(state.view.ship_indentation) - removed_chars)
+ span[1] = string.sub(span[1], chars_to_remove + 1)
+ removed_chars = removed_chars + (span_length - #span[1])
+ end
+ end
+ end
+ return Ui.Node {
+ Ui.HlTextNode(ship),
+ Ui.HlTextNode(water),
+ }
+end
+
+---@param state InstallerUiState
+local function GenericHelp(state)
+ local keymap_tuples = {
+ { "Toggle help", "?" },
+ { "Toggle package info", settings.current.ui.keymaps.toggle_package_expand },
+ { "Apply language filter", settings.current.ui.keymaps.apply_language_filter },
+ { "Install package", settings.current.ui.keymaps.install_package },
+ { "Uninstall package", settings.current.ui.keymaps.uninstall_package },
+ { "Update package", settings.current.ui.keymaps.update_package },
+ { "Update all installed packages", settings.current.ui.keymaps.update_all_packages },
+ { "Check for new package version", settings.current.ui.keymaps.check_package_version },
+ { "Check for new versions (all packages)", settings.current.ui.keymaps.check_outdated_packages },
+ { "Cancel installation of package", settings.current.ui.keymaps.cancel_installation },
+ { "Close window", "q" },
+ { "Close window", "<Esc>" },
+ }
+
+ local is_current_settings_expanded = state.view.is_current_settings_expanded
+
+ return Ui.Node {
+ Ui.HlTextNode {
+ { p.muted "Mason log: ", p.none(log.outfile) },
+ },
+ Ui.EmptyLine(),
+ Ui.Table(vim.list_extend(
+ {
+ {
+ p.Bold "Keyboard shortcuts",
+ },
+ },
+ _.map(function(keymap_tuple)
+ return { p.muted(keymap_tuple[1]), p.highlight(keymap_tuple[2]) }
+ end, keymap_tuples)
+ )),
+ Ui.EmptyLine(),
+ Ui.HlTextNode {
+ { p.Bold "Problems installing/uninstalling packages" },
+ {
+ p.muted "Make sure you meet the minimum requirements to install packages. For debugging, refer to:",
+ },
+ },
+ Ui.CascadingStyleNode({ "INDENT" }, {
+ Ui.HlTextNode {
+ {
+ p.highlight ":help mason-debugging",
+ },
+ {
+ p.highlight ":checkhealth mason",
+ },
+ },
+ }),
+ Ui.EmptyLine(),
+ Ui.HlTextNode {
+ { p.Bold "Problems with package functionality" },
+ {
+ p.muted "Please refer to each language package's own homepage for further assistance.",
+ },
+ },
+ Ui.EmptyLine(),
+ Ui.HlTextNode {
+ { p.Bold "Missing a package?" },
+ {
+ p.muted "Create an issue at ",
+ p.highlight "https://github.com/williamboman/mason.nvim/issues/new/choose",
+ },
+ },
+ Ui.EmptyLine(),
+ Ui.HlTextNode {
+ {
+ p.Bold(("%s Current settings"):format(is_current_settings_expanded and "↓" or "→")),
+ p.highlight " :help mason-settings",
+ },
+ },
+ Ui.Keybind(settings.current.ui.keymaps.toggle_package_expand, "TOGGLE_EXPAND_CURRENT_SETTINGS", nil),
+ Ui.When(is_current_settings_expanded, function()
+ local settings_split_by_newline = vim.split(vim.inspect(settings.current), "\n")
+ local current_settings = _.map(function(line)
+ return { p.muted(line) }
+ end, settings_split_by_newline)
+ return Ui.HlTextNode(current_settings)
+ end),
+ }
+end
+
+---@param state InstallerUiState
+return function(state)
+ ---@type INode
+ local heading = Ui.Node {}
+ if state.view.current == "LSP" then
+ heading = Ui.Node {
+ LSPHelp(state),
+ Ui.EmptyLine(),
+ }
+ elseif state.view.current == "DAP" then
+ heading = Ui.Node {
+ DAPHelp(state),
+ Ui.EmptyLine(),
+ }
+ end
+
+ return Ui.CascadingStyleNode({ "INDENT" }, {
+ Ui.HlTextNode(state.view.has_changed and p.none "" or p.Comment "(change view by pressing its number)"),
+ heading,
+ GenericHelp(state),
+ Ui.EmptyLine(),
+ Ship(state),
+ Ui.EmptyLine(),
+ })
+end
diff --git a/lua/mason/ui/components/help/lsp.lua b/lua/mason/ui/components/help/lsp.lua
new file mode 100644
index 00000000..e8b5a980
--- /dev/null
+++ b/lua/mason/ui/components/help/lsp.lua
@@ -0,0 +1,23 @@
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+
+---@param state InstallerUiState
+return function(state)
+ return Ui.HlTextNode {
+ {
+ p.none "The ",
+ p.highlight_secondary "L",
+ p.none "anguage ",
+ p.highlight_secondary "S",
+ p.none "erver ",
+ p.highlight_secondary "P",
+ p.none "rotocol defines the protocol used between an",
+ },
+ {
+ p.none "editor or IDE and a language server that provides language features",
+ },
+ {
+ p.none "like auto complete, go to definition, find all references etc.",
+ },
+ }
+end
diff --git a/lua/nvim-lsp-installer/ui/components/settings-schema.lua b/lua/mason/ui/components/json-schema.lua
index 04d8e0d5..8bb0e05d 100644
--- a/lua/nvim-lsp-installer/ui/components/settings-schema.lua
+++ b/lua/mason/ui/components/json-schema.lua
@@ -1,13 +1,16 @@
-- Here be dragons
-local Ui = require "nvim-lsp-installer.core.ui"
-local _ = require "nvim-lsp-installer.core.functional"
+local Ui = require "mason.core.ui"
+local _ = require "mason.core.functional"
+local settings = require "mason.settings"
local property_type_highlights = {
["string"] = "String",
["string[]"] = "String",
["boolean"] = "Boolean",
["number"] = "Number",
+ ["number[]"] = "Number",
["integer"] = "Number",
+ ["integer[]"] = "Number",
}
local function resolve_type(property_schema)
@@ -33,21 +36,23 @@ local function Indent(indentation, children)
return Ui.CascadingStyleNode(indent, children)
end
----@param server ServerState
+---@param package Package
+---@param schema_id string
+---@param state UiPackageState
---@param schema table
---@param key string|nil
----@param level number
----@param key_width number @The width the key should occupate in the UI to produce an even column.
+---@param level number|nil
+---@param key_width number|nil @The width the key should occupate in the UI to produce an even column.
---@param compound_key string|nil
-local function ServerSettingsSchema(server, schema, key, level, key_width, compound_key)
+local function JsonSchema(package, schema_id, state, schema, key, level, key_width, compound_key)
level = level or 0
compound_key = ("%s%s"):format(compound_key or "", key or "")
local toggle_expand_keybind = Ui.Keybind(
- "<CR>",
- "TOGGLE_SERVER_SCHEMA_SETTING",
- { name = server.name, key = compound_key }
+ settings.current.ui.keymaps.toggle_package_expand,
+ "TOGGLE_JSON_SCHEMA_KEY",
+ { package = package, schema_id = schema_id, key = compound_key }
)
- local node_is_expanded = server.expanded_schema_properties[compound_key]
+ local node_is_expanded = state.expanded_json_schema_keys[schema_id][compound_key]
local key_prefix = node_is_expanded and "↓ " or "→ "
if (schema.type == "object" or schema.type == nil) and schema.properties then
@@ -57,7 +62,7 @@ local function ServerSettingsSchema(server, schema, key, level, key_width, compo
-- It'll act as the anchor for its children.
local heading = Ui.HlTextNode {
key_prefix .. key,
- node_is_expanded and "LspInstallerLabel" or "",
+ node_is_expanded and "Bold" or "",
}
nodes[#nodes + 1] = heading
nodes[#nodes + 1] = toggle_expand_keybind
@@ -71,12 +76,13 @@ local function ServerSettingsSchema(server, schema, key, level, key_width, compo
max_property_length = math.max(max_property_length, vim.api.nvim_strwidth(property))
sorted_properties[#sorted_properties + 1] = property
end
- -- TODO sort at moment of insert?
table.sort(sorted_properties)
for _, property in ipairs(sorted_properties) do
nodes[#nodes + 1] = Indent(level, {
- ServerSettingsSchema(
- server,
+ JsonSchema(
+ package,
+ schema_id,
+ state,
schema.properties[property],
property,
level + 1,
@@ -90,8 +96,10 @@ local function ServerSettingsSchema(server, schema, key, level, key_width, compo
elseif schema.oneOf then
local nodes = {}
for i, alternative_schema in ipairs(schema.oneOf) do
- nodes[#nodes + 1] = ServerSettingsSchema(
- server,
+ nodes[#nodes + 1] = JsonSchema(
+ package,
+ schema_id,
+ state,
alternative_schema,
("%s (alt. %d)"):format(key, i),
level,
@@ -110,7 +118,7 @@ local function ServerSettingsSchema(server, schema, key, level, key_width, compo
{
{
label,
- node_is_expanded and "LspInstallerLabel" or "",
+ node_is_expanded and "Bold" or "",
},
{
" default: ",
@@ -118,14 +126,14 @@ local function ServerSettingsSchema(server, schema, key, level, key_width, compo
},
{
vim.json.encode(schema.default),
- property_type_highlights[type] or "LspInstallerMuted",
+ property_type_highlights[type] or "NvimInstallerMuted",
},
},
}
else
heading = Ui.HlTextNode {
label,
- node_is_expanded and "LspInstallerLabel" or "",
+ node_is_expanded and "Bold" or "",
}
end
@@ -137,10 +145,10 @@ local function ServerSettingsSchema(server, schema, key, level, key_width, compo
return { { line, "Comment" } }
end, vim.split(schema.description or "No description available.", "\n"))
- local type_highlight = property_type_highlights[type] or "LspInstallerMuted"
+ local type_highlight = property_type_highlights[type] or "NvimInstallerMuted"
local table_rows = {
- { { "type", "LspInstallerMuted" }, { type, type_highlight } },
+ { { "type", "NvimInstallerMuted" }, { type, type_highlight } },
}
if vim.tbl_islist(schema.enum) then
@@ -150,7 +158,7 @@ local function ServerSettingsSchema(server, schema, key, level, key_width, compo
enum_description = "- " .. schema.enumDescriptions[idx]
end
table_rows[#table_rows + 1] = {
- { idx == 1 and "possible values" or "", "LspInstallerMuted" },
+ { idx == 1 and "possible values" or "", "NvimInstallerMuted" },
{ vim.json.encode(enum), type_highlight },
{ enum_description, "Comment" },
}
@@ -166,4 +174,4 @@ local function ServerSettingsSchema(server, schema, key, level, key_width, compo
end
end
-return ServerSettingsSchema
+return JsonSchema
diff --git a/lua/mason/ui/components/language-filter.lua b/lua/mason/ui/components/language-filter.lua
new file mode 100644
index 00000000..a3069272
--- /dev/null
+++ b/lua/mason/ui/components/language-filter.lua
@@ -0,0 +1,31 @@
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+
+---@param state InstallerUiState
+return function(state)
+ return Ui.CascadingStyleNode({ "INDENT" }, {
+ Ui.When(state.view.language_filter, function()
+ return Ui.Node {
+ Ui.EmptyLine(),
+ Ui.HlTextNode {
+ {
+ p.Bold "Language Filter: ",
+ p.highlight(state.view.language_filter),
+ p.Comment " press <Esc> to clear",
+ },
+ },
+ }
+ end),
+ Ui.When(not state.view.language_filter, function()
+ return Ui.Node {
+ Ui.EmptyLine(),
+ Ui.HlTextNode {
+ {
+ p.Bold "Language Filter:",
+ p.Comment " press <C-f> to apply filter",
+ },
+ },
+ }
+ end),
+ })
+end
diff --git a/lua/mason/ui/components/main/init.lua b/lua/mason/ui/components/main/init.lua
new file mode 100644
index 00000000..5122c871
--- /dev/null
+++ b/lua/mason/ui/components/main/init.lua
@@ -0,0 +1,12 @@
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+
+local PackageList = require "mason.ui.components.main.package_list"
+
+---@param state InstallerUiState
+return function(state)
+ return Ui.Node {
+ Ui.EmptyLine(),
+ PackageList(state),
+ }
+end
diff --git a/lua/mason/ui/components/main/package_list.lua b/lua/mason/ui/components/main/package_list.lua
new file mode 100644
index 00000000..49f82c5a
--- /dev/null
+++ b/lua/mason/ui/components/main/package_list.lua
@@ -0,0 +1,291 @@
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+local _ = require "mason.core.functional"
+local settings = require "mason.settings"
+
+local JsonSchema = require "mason.ui.components.json-schema"
+
+---@param props { state: InstallerUiState, heading: INode, packages: Package[], list_item_renderer: (fun(package: Package): INode), hide_when_empty: boolean }
+local function PackageListContainer(props)
+ local items = {}
+ for i = 1, #props.packages do
+ local package = props.packages[i]
+ if props.state.packages.visible[package.name] then
+ items[#items + 1] = props.list_item_renderer(package)
+ end
+ end
+
+ if props.hide_when_empty and #items == 0 then
+ return Ui.Node {}
+ end
+
+ return Ui.Node {
+ props.heading,
+ Ui.VirtualTextNode { p.Comment(("(%d)"):format(#items)) },
+ Ui.CascadingStyleNode({ "INDENT" }, items),
+ Ui.When(
+ #items == 0,
+ Ui.CascadingStyleNode({ "CENTERED" }, {
+ Ui.HlTextNode(p.Comment "No packages."),
+ })
+ ),
+ Ui.EmptyLine(),
+ }
+end
+
+---@param executables table<string, string> | nil
+local function ExecutablesTable(executables)
+ if not executables or _.size(executables) == 0 then
+ return Ui.Node {}
+ end
+ local rows = {}
+ for executable in pairs(executables) do
+ table.insert(rows, { p.none "", p.Bold(executable) })
+ end
+ rows[1][1] = p.muted "executables"
+ return rows
+end
+
+---@param state InstallerUiState
+---@param package Package
+---@param is_installed boolean
+local function ExpandedPackageInfo(state, package, is_installed)
+ local pkg_state = state.packages.states[package.name]
+ return Ui.CascadingStyleNode({ "INDENT" }, {
+ Ui.HlTextNode(p.Comment(package.spec.desc)),
+ Ui.EmptyLine(),
+ Ui.Table(_.concat(
+ _.filter(_.identity, {
+ is_installed and {
+ p.muted "installed version",
+ pkg_state.version and p.Bold(pkg_state.version)
+ or (pkg_state.is_checking_version and p.muted "Loading…" or p.muted "-"),
+ },
+ pkg_state.new_version and {
+ p.muted "latest version",
+ p.muted(pkg_state.new_version.latest_version),
+ },
+ {
+ p.muted "homepage",
+ package.spec.homepage and p.highlight(package.spec.homepage) or p.muted "-",
+ },
+ {
+ p.muted "languages",
+ #package.spec.languages > 0 and p.Bold(table.concat(package.spec.languages, ", ")) or p.muted "-",
+ },
+ {
+ p.muted "categories",
+ #package.spec.categories > 0 and p.Bold(table.concat(package.spec.categories, ", ")) or p.muted "-",
+ },
+ }),
+ ExecutablesTable(is_installed and pkg_state.linked_executables or package.spec.executables)
+ )),
+ -- ExecutablesTable(is_installed and pkg_state.linked_executables or package.spec.executables),
+ Ui.When(pkg_state.lsp_settings_schema, function()
+ local has_expanded = pkg_state.expanded_json_schemas["lsp"]
+ return Ui.Node {
+ Ui.EmptyLine(),
+ Ui.HlTextNode {
+ {
+ p.Bold(("%s LSP server configuration schema"):format(has_expanded and "↓" or "→")),
+ p.Comment((" (press enter to %s)"):format(has_expanded and "collapse" or "expand")),
+ },
+ },
+ Ui.Keybind(
+ settings.current.ui.keymaps.toggle_package_expand,
+ "TOGGLE_JSON_SCHEMA",
+ { package = package, schema_id = "lsp" }
+ ),
+ Ui.When(has_expanded, function()
+ return Ui.CascadingStyleNode({ "INDENT" }, {
+ Ui.HlTextNode(
+ p.muted "This is a read-only overview of the settings this server accepts. Note that some settings might not apply to neovim."
+ ),
+ Ui.EmptyLine(),
+ JsonSchema(package, "lsp", pkg_state, pkg_state.lsp_settings_schema),
+ })
+ end),
+ }
+ end),
+ Ui.EmptyLine(),
+ })
+end
+
+---@param state InstallerUiState
+---@param package Package
+---@param opts { keybinds: KeybindHandlerNode[], icon: string[], is_installed: boolean }
+local function PackageComponent(state, package, opts)
+ local pkg_state = state.packages.states[package.name]
+ local is_expanded = state.packages.expanded == package.name
+ local label = is_expanded and p.Bold(" " .. package.name) or p.none(" " .. package.name)
+
+ return Ui.Node {
+ Ui.HlTextNode { { opts.icon, label } },
+ Ui.StickyCursor { id = package.spec.name },
+ Ui.When(pkg_state.is_checking_new_version, function()
+ return Ui.VirtualTextNode { p.Comment " checking for new version…" }
+ end),
+ Ui.Keybind(settings.current.ui.keymaps.check_package_version, "CHECK_NEW_PACKAGE_VERSION", package),
+ Ui.When(pkg_state.new_version, function()
+ return Ui.DiagnosticsNode {
+ message = ("new version available: %s %s -> %s"):format(
+ pkg_state.new_version.name,
+ pkg_state.new_version.current_version,
+ pkg_state.new_version.latest_version
+ ),
+ severity = vim.diagnostic.severity.INFO,
+ source = pkg_state.new_version.name,
+ }
+ end),
+ Ui.Node(opts.keybinds),
+ Ui.When(is_expanded, function()
+ return ExpandedPackageInfo(state, package, opts.is_installed)
+ end),
+ }
+end
+
+---@param state InstallerUiState
+local function Installed(state)
+ return Ui.Node {
+ Ui.Keybind(
+ settings.current.ui.keymaps.check_outdated_packages,
+ "CHECK_NEW_VISIBLE_PACKAGE_VERSIONS",
+ nil,
+ true
+ ),
+ PackageListContainer {
+ state = state,
+ heading = Ui.Node {
+ Ui.HlTextNode(p.heading "Installed"),
+ Ui.When(state.packages.new_versions_check.is_checking, function()
+ local new_versions_check = state.packages.new_versions_check
+ local styling = new_versions_check.percentage_complete == 1 and p.highlight_block or p.muted_block
+ return Ui.VirtualTextNode {
+ p.Comment "checking for new package versions ",
+ styling(("%-4s"):format(math.floor(new_versions_check.percentage_complete * 100) .. "%")),
+ styling((" "):rep(new_versions_check.percentage_complete * 15)),
+ }
+ end),
+ },
+ packages = state.packages.installed,
+ ---@param package Package
+ list_item_renderer = function(package)
+ return PackageComponent(state, package, {
+ is_installed = true,
+ icon = p.highlight(settings.current.ui.icons.package_installed),
+ keybinds = {
+ Ui.Keybind(settings.current.ui.keymaps.update_package, "INSTALL_PACKAGE", package),
+ Ui.Keybind(settings.current.ui.keymaps.uninstall_package, "UNINSTALL_PACKAGE", package),
+ Ui.Keybind(settings.current.ui.keymaps.toggle_package_expand, "TOGGLE_EXPAND_SERVER", package),
+ },
+ })
+ end,
+ },
+ }
+end
+
+---@param state InstallerUiState
+local function Installing(state)
+ local packages = state.packages.installing
+ return PackageListContainer {
+ state = state,
+ heading = Ui.HlTextNode(p.heading "Installing"),
+ hide_when_empty = true,
+ packages = packages,
+ ---@param package Package
+ list_item_renderer = function(package)
+ ---@type UiPackageState
+ local pkg_state = state.packages.states[package.name]
+ local current_state = pkg_state.is_terminated and p.Comment " (cancelling)" or p.none ""
+ return Ui.Node {
+ Ui.HlTextNode {
+ {
+ p.highlight(settings.current.ui.icons.package_pending),
+ p.none(" " .. package.name),
+ current_state,
+ pkg_state.latest_spawn and p.Comment((" $ %s"):format(pkg_state.latest_spawn)) or p.none "",
+ },
+ },
+ Ui.Keybind(settings.current.ui.keymaps.cancel_installation, "TERMINATE_PACKAGE_HANDLE", package),
+ Ui.CascadingStyleNode({ "INDENT" }, {
+ Ui.HlTextNode(_.map(function(line)
+ return { p.muted(line) }
+ end, pkg_state.tailed_output)),
+ }),
+ }
+ end,
+ }
+end
+
+---@param state InstallerUiState
+local function Queued(state)
+ local packages = state.packages.queued
+ return PackageListContainer {
+ state = state,
+ heading = Ui.HlTextNode(p.heading "Queued"),
+ packages = packages,
+ hide_when_empty = true,
+ ---@param package Package
+ list_item_renderer = function(package)
+ return Ui.Node {
+ Ui.HlTextNode {
+ { p.highlight(settings.current.ui.icons.package_pending), p.none(" " .. package.name) },
+ },
+ Ui.Keybind(settings.current.ui.keymaps.cancel_installation, "DEQUEUE_PACKAGE", package),
+ }
+ end,
+ }
+end
+
+---@param state InstallerUiState
+local function Failed(state)
+ local packages = state.packages.failed
+ if #packages == 0 then
+ return Ui.Node {}
+ end
+ return PackageListContainer {
+ state = state,
+ heading = Ui.HlTextNode(p.heading "Failed"),
+ packages = packages,
+ ---@param package Package
+ list_item_renderer = function(package)
+ return PackageComponent(state, package, {
+ icon = p.error(settings.current.ui.icons.package_pending),
+ keybinds = {
+ Ui.Keybind(settings.current.ui.keymaps.install_package, "INSTALL_PACKAGE", package),
+ Ui.Keybind(settings.current.ui.keymaps.toggle_package_expand, "TOGGLE_EXPAND_SERVER", package),
+ },
+ })
+ end,
+ }
+end
+
+---@param state InstallerUiState
+local function Uninstalled(state)
+ return PackageListContainer {
+ state = state,
+ heading = Ui.HlTextNode(p.heading "Available"),
+ packages = state.packages.uninstalled,
+ ---@param package Package
+ list_item_renderer = function(package)
+ return PackageComponent(state, package, {
+ icon = p.muted(settings.current.ui.icons.package_uninstalled),
+ keybinds = {
+ Ui.Keybind(settings.current.ui.keymaps.install_package, "INSTALL_PACKAGE", package),
+ Ui.Keybind(settings.current.ui.keymaps.toggle_package_expand, "TOGGLE_EXPAND_SERVER", package),
+ },
+ })
+ end,
+ }
+end
+
+---@param state InstallerUiState
+return function(state)
+ return Ui.CascadingStyleNode({ "INDENT" }, {
+ Installed(state),
+ Installing(state),
+ Queued(state),
+ Failed(state),
+ Uninstalled(state),
+ })
+end
diff --git a/lua/mason/ui/components/tabs.lua b/lua/mason/ui/components/tabs.lua
new file mode 100644
index 00000000..ea4f33fb
--- /dev/null
+++ b/lua/mason/ui/components/tabs.lua
@@ -0,0 +1,38 @@
+local Package = require "mason.core.package"
+local Ui = require "mason.core.ui"
+local p = require "mason.ui.palette"
+
+---@param text string
+---@param index integer
+---@param is_active boolean
+---@param use_secondary_highlight boolean
+local function create_tab_span(text, index, is_active, use_secondary_highlight)
+ local highlight_block = use_secondary_highlight and p.highlight_block_bold_secondary or p.highlight_block_bold
+
+ if is_active then
+ return {
+ highlight_block " ",
+ highlight_block("(" .. index .. ")"),
+ highlight_block(" " .. text .. " "),
+ p.none " ",
+ }
+ else
+ return {
+ p.muted_block " ",
+ p.muted_block("(" .. index .. ")"),
+ p.muted_block(" " .. text .. " "),
+ p.none " ",
+ }
+ end
+end
+
+---@param state InstallerUiState
+return function(state)
+ local tabs = {}
+ for i, text in ipairs { "All", Package.Cat.LSP, Package.Cat.DAP, Package.Cat.Linter, Package.Cat.Formatter } do
+ vim.list_extend(tabs, create_tab_span(text, i, state.view.current == text, state.view.is_showing_help))
+ end
+ return Ui.CascadingStyleNode({ "INDENT" }, {
+ Ui.HlTextNode { tabs },
+ })
+end
diff --git a/lua/mason/ui/init.lua b/lua/mason/ui/init.lua
new file mode 100644
index 00000000..56b0b382
--- /dev/null
+++ b/lua/mason/ui/init.lua
@@ -0,0 +1,11 @@
+local settings = require "mason.settings"
+local M = {}
+
+M.open = function()
+ local window = require "mason.ui.instance"
+ window.open {
+ border = settings.current.ui.border,
+ }
+end
+
+return M
diff --git a/lua/mason/ui/instance.lua b/lua/mason/ui/instance.lua
new file mode 100644
index 00000000..d01a8782
--- /dev/null
+++ b/lua/mason/ui/instance.lua
@@ -0,0 +1,578 @@
+local display = require "mason.core.ui.display"
+local Ui = require "mason.core.ui"
+local a = require "mason.core.async"
+local control = require "mason.core.async.control"
+local _ = require "mason.core.functional"
+local palette = require "mason.ui.palette"
+local indexer = require "mason.core.package.indexer"
+local Package = require "mason.core.package"
+local spawn = require "mason.core.spawn"
+local settings = require "mason.settings"
+local platform = require "mason.core.platform"
+local notify = require "mason.notify"
+
+local Header = require "mason.ui.components.header"
+local Footer = require "mason.ui.components.footer"
+local Help = require "mason.ui.components.help"
+local Tabs = require "mason.ui.components.tabs"
+local Main = require "mason.ui.components.main"
+local LanguageFilter = require "mason.ui.components.language-filter"
+
+local Semaphore = control.Semaphore
+
+---@param state InstallerUiState
+local function GlobalKeybinds(state)
+ return Ui.Node {
+ Ui.Keybind("?", "TOGGLE_HELP", nil, true),
+ Ui.Keybind("q", "CLOSE_WINDOW", nil, true),
+ Ui.When(not state.view.language_filter, Ui.Keybind("<Esc>", "CLOSE_WINDOW", nil, true)),
+ Ui.When(state.view.language_filter, Ui.Keybind("<Esc>", "CLEAR_LANGUAGE_FILTER", nil, true)),
+ Ui.Keybind(settings.current.ui.keymaps.apply_language_filter, "LANGUAGE_FILTER", nil, true),
+
+ Ui.Keybind("1", "SET_VIEW", "All", true),
+ Ui.Keybind("2", "SET_VIEW", "LSP", true),
+ Ui.Keybind("3", "SET_VIEW", "DAP", true),
+ Ui.Keybind("4", "SET_VIEW", "Linter", true),
+ Ui.Keybind("5", "SET_VIEW", "Formatter", true),
+ }
+end
+
+---@class UiPackageState
+---@field is_terminated boolean
+---@field latest_spawn string|nil
+---@field tailed_output string[]
+---@field linked_executables table<string, string>
+---@field version string|nil
+---@field is_checking_version boolean
+---@field lsp_settings_schema table|nil
+---@field new_version NewPackageVersion|nil
+---@field is_checking_new_version boolean
+---@field expanded_json_schemas table<string, boolean>
+---@field expanded_json_schema_keys table<string, table<string, boolean>>
+
+---@class InstallerUiState
+local INITIAL_STATE = {
+ stats = {
+ used_disk_space = nil,
+ },
+ view = {
+ is_showing_help = false,
+ is_current_settings_expanded = false,
+ language_filter = nil,
+ current = "All",
+ has_changed = false,
+ ship_indentation = 0,
+ ship_exclamation = "",
+ },
+ header = {
+ title_prefix = "", -- for animation
+ },
+ packages = {
+ new_versions_check = {
+ is_checking = false,
+ current = 0,
+ total = 0,
+ percentage_complete = 0,
+ },
+ ---@type table<string, boolean>
+ visible = {},
+ ---@type string|nil
+ expanded = nil,
+ ---@type table<string, UiPackageState>
+ states = {},
+ ---@type Package[]
+ installed = {},
+ ---@type Package[]
+ installing = {},
+ ---@type Package[]
+ failed = {},
+ ---@type Package[]
+ queued = {},
+ ---@type Package[]
+ uninstalled = {},
+ },
+}
+
+---@generic T
+---@param list T[]
+---@param item T
+---@return T
+local function remove(list, item)
+ for i, v in ipairs(list) do
+ if v == item then
+ table.remove(list, i)
+ return list
+ end
+ end
+ return list
+end
+
+local window = display.new_view_only_win("Installer Info", "mason.nvim")
+local packages = _.sort_by(_.prop "name", indexer.get_all_packages())
+
+window.view(
+ ---@param state InstallerUiState
+ function(state)
+ return Ui.Node {
+ GlobalKeybinds(state),
+ Header(state),
+ Tabs(state),
+ Ui.When(state.view.is_showing_help, function()
+ return Help(state)
+ end),
+ Ui.When(not state.view.is_showing_help, function()
+ return Ui.Node {
+ LanguageFilter(state),
+ Main(state),
+ }
+ end),
+ Footer(state),
+ }
+ end
+)
+
+local mutate_state, get_state = window.state(INITIAL_STATE)
+
+local calculate_stats = a.scope(function()
+ -- TODO windows
+ if platform.is.unix then
+ spawn.du({ "-sh", settings.current.install_root_dir }):map(function(result)
+ local _, _, match = result.stdout:find "^(%S+)"
+ if match then
+ mutate_state(function(state)
+ state.stats.used_disk_space = match
+ end)
+ end
+ end)
+ end
+end)
+
+---@param package Package
+---@param group string
+---@param tail boolean|nil @Whether to insert at the end.
+local function mutate_package_grouping(package, group, tail)
+ mutate_state(function(state)
+ remove(state.packages.installing, package)
+ remove(state.packages.queued, package)
+ remove(state.packages.uninstalled, package)
+ remove(state.packages.installed, package)
+ remove(state.packages.failed, package)
+ if tail then
+ table.insert(state.packages[group], package)
+ else
+ table.insert(state.packages[group], 1, package)
+ end
+ end)
+end
+
+---@param mutate_fn fun(state: InstallerUiState)
+local function mutate_package_visibility(mutate_fn)
+ mutate_state(function(state)
+ mutate_fn(state)
+ local view_predicate = {
+ ["All"] = _.T,
+ ["LSP"] = _.prop_satisfies(_.any(_.equals(Package.Cat.LSP)), "categories"),
+ ["DAP"] = _.prop_satisfies(_.any(_.equals(Package.Cat.DAP)), "categories"),
+ ["Linter"] = _.prop_satisfies(_.any(_.equals(Package.Cat.Linter)), "categories"),
+ ["Formatter"] = _.prop_satisfies(_.any(_.equals(Package.Cat.Formatter)), "categories"),
+ }
+ local language_predicate = _.if_else(
+ _.always(state.view.language_filter),
+ _.prop_satisfies(_.any(_.equals(state.view.language_filter)), "languages"),
+ _.T
+ )
+ for __, package in ipairs(packages) do
+ state.packages.visible[package.name] = _.all_pass(
+ { view_predicate[state.view.current], language_predicate },
+ package.spec
+ )
+ end
+ end)
+end
+
+---@param handle InstallHandle
+local function setup_handle(handle)
+ ---@param new_state InstallHandleState
+ local function handle_state_change(new_state)
+ if new_state == "QUEUED" then
+ mutate_package_grouping(handle.package, "queued", true)
+ elseif new_state == "ACTIVE" then
+ mutate_package_grouping(handle.package, "installing", true)
+ end
+ end
+
+ local function handle_spawninfo_change()
+ mutate_state(function(state)
+ state.packages.states[handle.package.name].latest_spawn = handle
+ :peek_spawninfo_stack()
+ :map(tostring)
+ :or_else(nil)
+ end)
+ end
+
+ ---@param chunk string
+ local function handle_output(chunk)
+ mutate_state(function(state)
+ -- TODO: fix this
+ local pkg_state = state.packages.states[handle.package.name]
+ for idx, line in ipairs(vim.split(chunk, "\n")) do
+ if idx == 1 and pkg_state.tailed_output[#pkg_state.tailed_output] then
+ pkg_state.tailed_output[#pkg_state.tailed_output] = pkg_state.tailed_output[#pkg_state.tailed_output]
+ .. line
+ else
+ pkg_state.tailed_output[#pkg_state.tailed_output + 1] = line
+ end
+ end
+ pkg_state.tailed_output = {
+ pkg_state.tailed_output[#pkg_state.tailed_output - 1] or "",
+ pkg_state.tailed_output[#pkg_state.tailed_output] or "",
+ }
+ end)
+ end
+
+ local function handle_terminate()
+ mutate_state(function(state)
+ state.packages.states[handle.package.name].is_terminated = handle.is_terminated
+ if handle:is_queued() then
+ -- This is really already handled by the "install:failed" handler, but for UX reasons we handle
+ -- terminated, queued, handlers here. The reason for this is that a queued handler, which is
+ -- aborted, will not fail its installation until it acquires a semaphore permit, leading to a weird
+ -- UX that may be perceived as non-functional.
+ mutate_package_grouping(handle.package, handle.package:is_installed() and "installed" or "uninstalled")
+ end
+ end)
+ end
+
+ handle:on("terminate", handle_terminate)
+ handle:on("state:change", handle_state_change)
+ handle:on("spawninfo:change", handle_spawninfo_change)
+ handle:on("stdout", handle_output)
+ handle:on("stderr", handle_output)
+
+ -- hydrate initial state
+ handle_state_change(handle.state)
+ handle_terminate()
+ handle_spawninfo_change()
+ mutate_state(function(state)
+ state.packages.states[handle.package.name].tailed_output = {}
+ end)
+end
+
+---@param package Package
+local function hydrate_detailed_package_state(package)
+ mutate_state(function(state)
+ state.packages.states[package.name].is_checking_version = true
+ -- initialize expanded keys table
+ state.packages.states[package.name].expanded_json_schema_keys["lsp"] = state.packages.states[package.name].expanded_json_schema_keys["lsp"]
+ or {}
+ state.packages.states[package.name].lsp_settings_schema = package:get_lsp_settings_schema():or_else(nil)
+ end)
+
+ package:get_installed_version(function(success, version_or_err)
+ mutate_state(function(state)
+ state.packages.states[package.name].is_checking_version = false
+ if success then
+ state.packages.states[package.name].version = version_or_err
+ end
+ end)
+ end)
+
+ package:get_receipt():if_present(
+ ---@param receipt InstallReceipt
+ function(receipt)
+ mutate_state(function(state)
+ state.packages.states[package.name].linked_executables = receipt.executables
+ end)
+ end
+ )
+end
+
+local function create_initial_package_state()
+ return {
+ latest_spawn = nil,
+ tailed_output = {},
+ version = nil,
+ is_checking_version = false,
+ new_version = nil,
+ is_checking_new_version = false,
+ expanded_json_schemas = {},
+ expanded_json_schema_keys = {},
+ }
+end
+
+for _, package in ipairs(packages) do
+ -- hydrate initial state
+ mutate_state(function(state)
+ state.packages.states[package.name] = create_initial_package_state()
+ state.packages.visible[package.name] = true
+ end)
+ mutate_package_grouping(package, package:is_installed() and "installed" or "uninstalled", true)
+
+ package:get_handle():if_present(setup_handle)
+ package:on("handle", setup_handle)
+
+ package:on("install:success", function()
+ if get_state().packages.expanded == package.name then
+ hydrate_detailed_package_state(package)
+ end
+ mutate_package_grouping(package, "installed")
+ calculate_stats()
+ vim.schedule_wrap(notify)(("%q was successfully installed."):format(package.name))
+ end)
+
+ package:on(
+ "install:failed",
+ ---@param handle InstallHandle
+ function(handle)
+ if handle.is_terminated then
+ -- If installation was explicitly terminated - restore to "pristine" state
+ mutate_package_grouping(package, package:is_installed() and "installed" or "uninstalled")
+ else
+ mutate_package_grouping(package, "failed")
+ end
+ end
+ )
+
+ package:on("uninstall:success", function()
+ mutate_package_grouping(package, "uninstalled")
+ mutate_state(function(state)
+ state.packages.states[package.name] = create_initial_package_state()
+ end)
+ calculate_stats()
+ end)
+end
+
+local help_animation
+do
+ local help_command = ":help"
+ local help_command_len = #help_command
+ help_animation = Ui.animation {
+ function(tick)
+ mutate_state(function(state)
+ state.header.title_prefix = help_command:sub(help_command_len - tick, help_command_len)
+ end)
+ end,
+ range = { 0, help_command_len },
+ delay_ms = 80,
+ }
+end
+
+local ship_animation = Ui.animation {
+ function(tick)
+ mutate_state(function(state)
+ state.view.ship_indentation = tick
+ if tick > -5 then
+ state.view.ship_exclamation = "https://github.com/sponsors/williamboman"
+ elseif tick > -27 then
+ state.view.ship_exclamation = "Sponsor mason.nvim development!"
+ else
+ state.view.ship_exclamation = ""
+ end
+ end)
+ end,
+ range = { -35, 5 },
+ delay_ms = 250,
+}
+
+local function toggle_help()
+ mutate_state(function(state)
+ state.view.is_showing_help = not state.view.is_showing_help
+ if state.view.is_showing_help then
+ help_animation()
+ ship_animation()
+ end
+ end)
+end
+
+local function set_view(event)
+ local view = event.payload
+ mutate_package_visibility(function(state)
+ state.view.current = view
+ state.view.has_changed = true
+ end)
+end
+
+local function terminate_package_handle(event)
+ ---@type Package
+ local package = event.payload
+ package:get_handle():if_present(
+ ---@param handle InstallHandle
+ function(handle)
+ vim.schedule_wrap(notify)(("Cancelling installation of %q."):format(package.name))
+ handle:terminate()
+ end
+ )
+end
+
+local function install_package(event)
+ ---@type Package
+ local package = event.payload
+ package:install()
+end
+
+local function uninstall_package(event)
+ ---@type Package
+ local package = event.payload
+ package:uninstall()
+ vim.schedule_wrap(notify)(("%q was successfully uninstalled."):format(package.name))
+end
+
+local function dequeue_package(event)
+ ---@type Package
+ local package = event.payload
+ package:get_handle():if_present(
+ ---@param handle InstallHandle
+ function(handle)
+ if not handle:is_closed() then
+ handle:terminate()
+ end
+ end
+ )
+end
+
+local function toggle_expand_server(event)
+ ---@type Package
+ local package = event.payload
+ mutate_state(function(state)
+ if state.packages.expanded == package.name then
+ state.packages.expanded = nil
+ else
+ hydrate_detailed_package_state(package)
+ state.packages.expanded = package.name
+ end
+ end)
+end
+
+---@async
+---@param package Package
+local function check_new_package_version(package)
+ mutate_state(function(state)
+ state.packages.states[package.name].is_checking_new_version = true
+ end)
+ a.wait(function(resolve, reject)
+ package:check_new_version(function(success, new_version)
+ mutate_state(function(state)
+ state.packages.states[package.name].is_checking_new_version = false
+ if success then
+ state.packages.states[package.name].new_version = new_version
+ end
+ end)
+ if success then
+ resolve(new_version)
+ else
+ reject(new_version)
+ end
+ end)
+ end)
+end
+
+---@async
+local function check_new_visible_package_versions()
+ local state = get_state()
+ if state.packages.new_versions_check.is_checking then
+ return
+ end
+ local installed_visible_packages = _.filter(function(package)
+ return state.packages.visible[package.name]
+ end, state.packages.installed)
+
+ if #installed_visible_packages == 0 then
+ return
+ end
+
+ mutate_state(function(state)
+ state.packages.new_versions_check.is_checking = true
+ state.packages.new_versions_check.current = 0
+ state.packages.new_versions_check.total = #installed_visible_packages
+ state.packages.new_versions_check.percentage_complete = 0
+ end)
+
+ local sem = Semaphore.new(5)
+ a.wait_all(_.map(function(package)
+ return function()
+ local permit = sem:acquire()
+ pcall(check_new_package_version, package)
+ mutate_state(function(state)
+ state.packages.new_versions_check.current = state.packages.new_versions_check.current + 1
+ state.packages.new_versions_check.percentage_complete = state.packages.new_versions_check.current
+ / state.packages.new_versions_check.total
+ end)
+ permit:forget()
+ end
+ end, installed_visible_packages))
+
+ a.sleep(800)
+ mutate_state(function(state)
+ state.packages.new_versions_check.is_checking = false
+ state.packages.new_versions_check.current = 0
+ state.packages.new_versions_check.total = 0
+ state.packages.new_versions_check.percentage_complete = 0
+ end)
+end
+
+local function toggle_json_schema(event)
+ local package, schema_id = event.payload.package, event.payload.schema_id
+ mutate_state(function(state)
+ state.packages.states[package.name].expanded_json_schemas[schema_id] =
+ not state.packages.states[package.name].expanded_json_schemas[schema_id]
+ end)
+end
+
+local function toggle_json_schema_keys(event)
+ local package, schema_id, key = event.payload.package, event.payload.schema_id, event.payload.key
+ mutate_state(function(state)
+ state.packages.states[package.name].expanded_json_schema_keys[schema_id][key] =
+ not state.packages.states[package.name].expanded_json_schema_keys[schema_id][key]
+ end)
+end
+
+local function filter()
+ vim.ui.select(_.sort_by(_.identity, _.keys(Package.Lang)), {
+ prompt = "Select language:",
+ }, function(choice)
+ if not choice or choice == "" then
+ return
+ end
+ mutate_package_visibility(function(state)
+ state.view.language_filter = choice
+ end)
+ end)
+end
+
+local function clear_filter()
+ mutate_package_visibility(function(state)
+ state.view.language_filter = nil
+ end)
+end
+
+local function toggle_expand_current_settings()
+ mutate_state(function(state)
+ state.view.is_current_settings_expanded = not state.view.is_current_settings_expanded
+ end)
+end
+
+local effects = {
+ ["CHECK_NEW_PACKAGE_VERSION"] = a.scope(_.compose(_.partial(pcall, check_new_package_version), _.prop "payload")),
+ ["CHECK_NEW_VISIBLE_PACKAGE_VERSIONS"] = a.scope(check_new_visible_package_versions),
+ ["CLEAR_LANGUAGE_FILTER"] = clear_filter,
+ ["CLOSE_WINDOW"] = window.close,
+ ["DEQUEUE_PACKAGE"] = dequeue_package,
+ ["INSTALL_PACKAGE"] = install_package,
+ ["LANGUAGE_FILTER"] = filter,
+ ["SET_VIEW"] = set_view,
+ ["TERMINATE_PACKAGE_HANDLE"] = terminate_package_handle,
+ ["TOGGLE_EXPAND_CURRENT_SETTINGS"] = toggle_expand_current_settings,
+ ["TOGGLE_EXPAND_SERVER"] = toggle_expand_server,
+ ["TOGGLE_HELP"] = toggle_help,
+ ["TOGGLE_JSON_SCHEMA"] = toggle_json_schema,
+ ["TOGGLE_JSON_SCHEMA_KEY"] = toggle_json_schema_keys,
+ ["UNINSTALL_PACKAGE"] = uninstall_package,
+}
+
+window.init {
+ effects = effects,
+ highlight_groups = palette.highlight_groups,
+}
+
+calculate_stats()
+return window
diff --git a/lua/mason/ui/palette.lua b/lua/mason/ui/palette.lua
new file mode 100644
index 00000000..a6708e88
--- /dev/null
+++ b/lua/mason/ui/palette.lua
@@ -0,0 +1,55 @@
+local M = {}
+
+M.highlight_groups = {
+ NvimInstallerHeader = { bold = true, fg = "#222222", bg = "#DCA561" },
+ NvimInstallerHeaderSecondary = { bold = true, fg = "#222222", bg = "#56B6C2" },
+
+ NvimInstallerHighlight = { fg = "#56B6C2" },
+ NvimInstallerHighlightBlock = { bg = "#56B6C2", fg = "#222222" },
+ NvimInstallerHighlightBlockBold = { bg = "#56B6C2", fg = "#222222", bold = true },
+
+ NvimInstallerHighlightSecondary = { fg = "#DCA561" },
+ NvimInstallerHighlightBlockSecondary = { bg = "#DCA561", fg = "#222222" },
+ NvimInstallerHighlightBlockBoldSecondary = { bg = "#DCA561", fg = "#222222", bold = true },
+
+ NvimInstallerLink = { link = "NvimInstallerHighlight" },
+
+ NvimInstallerMuted = { fg = "#888888" },
+ NvimInstallerMutedBlock = { bg = "#888888", fg = "#222222" },
+ NvimInstallerMutedBlockBold = { bg = "#888888", fg = "#222222", bold = true },
+
+ NvimInstallerError = { fg = "#f44747" },
+
+ NvimInstallerHeading = { bold = true },
+}
+
+local function hl(highlight)
+ return function(text)
+ return { text, highlight }
+ end
+end
+
+-- aliases
+M.none = hl ""
+M.header = hl "NvimInstallerHeader"
+M.header_secondary = hl "NvimInstallerHeaderSecondary"
+M.muted = hl "NvimInstallerMuted"
+M.muted_block = hl "NvimInstallerMutedBlock"
+M.muted_block_bold = hl "NvimInstallerMutedBlockBold"
+M.highlight = hl "NvimInstallerHighlight"
+M.highlight_block = hl "NvimInstallerHighlightBlock"
+M.highlight_block_bold = hl "NvimInstallerHighlightBlockBold"
+M.highlight_block_secondary = hl "NvimInstallerHighlightBlockSecondary"
+M.highlight_block_bold_secondary = hl "NvimInstallerHighlightBlockBoldSecondary"
+M.highlight_secondary = hl "NvimInstallerHighlightSecondary"
+M.error = hl "NvimInstallerError"
+M.heading = hl "NvimInstallerHeading"
+
+setmetatable(M, {
+ __index = function(self, key)
+ self[key] = hl(key)
+ return self[key]
+ end,
+})
+
+return M
diff --git a/lua/nvim-lsp-installer.lua b/lua/nvim-lsp-installer.lua
deleted file mode 100644
index 6a8b2786..00000000
--- a/lua/nvim-lsp-installer.lua
+++ /dev/null
@@ -1,284 +0,0 @@
-local fs = require "nvim-lsp-installer.core.fs"
-local notify = require "nvim-lsp-installer.notify"
-local dispatcher = require "nvim-lsp-installer.dispatcher"
-local process = require "nvim-lsp-installer.core.process"
-local status_win = require "nvim-lsp-installer.ui"
-local servers = require "nvim-lsp-installer.servers"
-local settings = require "nvim-lsp-installer.settings"
-local log = require "nvim-lsp-installer.log"
-local platform = require "nvim-lsp-installer.core.platform"
-local language_autocomplete_map = require "nvim-lsp-installer._generated.language_autocomplete_map"
-local filetype_server_map = require "nvim-lsp-installer._generated.filetype_map"
-
-local M = {}
-
-M.settings = settings.set
-
----@param server_identifiers string[]
-local function ensure_installed(server_identifiers)
- local candidates = {}
- for _, server_identifier in ipairs(server_identifiers) do
- local server_name, version = servers.parse_server_identifier(server_identifier)
- local ok, server = servers.get_server(server_name)
- if ok and not server:is_installed() then
- table.insert(candidates, server_name)
- server:install(version)
- end
- end
- if #candidates > 0 then
- notify("Installing LSP servers: " .. table.concat(candidates, ", "))
- end
-end
-
----@param config LspInstallerSettings
-function M.setup(config)
- if config then
- settings.set(config)
- end
- settings.uses_new_setup = true
- require("nvim-lsp-installer.middleware").register_lspconfig_hook()
-
- if vim.tbl_islist(settings.current.ensure_installed) then
- vim.schedule(function()
- ensure_installed(settings.current.ensure_installed)
- end)
- end
-end
-
-M.info_window = {
- ---Opens the status window.
- open = function()
- status_win().open()
- end,
- ---Closes the status window.
- close = function()
- status_win().close()
- end,
-}
-
-function M.get_install_completion()
- local result = {}
- local server_names = servers.get_available_server_names()
- vim.list_extend(result, server_names)
- vim.list_extend(result, vim.tbl_keys(language_autocomplete_map))
- return result
-end
-
----Raises an error with the provided message. If in a headless environment,
----will also schedule an immediate shutdown with the provided exit code.
----@param msg string
----@param code number @The exit code to use when in headless mode.
-local function raise_error(msg, code)
- if platform.is_headless then
- vim.schedule(function()
- -- We schedule the exit to make sure the call stack is exhausted
- os.exit(code or 1)
- end)
- end
- error(msg)
-end
-
----Installs the provided servers synchronously (blocking call). It's recommended to only use this in headless environments.
----@param server_identifiers string[] @A list of server identifiers (for example {"rust_analyzer@nightly", "tsserver"}).
-function M.install_sync(server_identifiers)
- local completed_servers = {}
- local failed_servers = {}
- local server_tuples = {}
-
- if vim.tbl_count(server_identifiers) == 0 then
- raise_error "No servers provided."
- end
-
- -- Collect all servers and exit early if unable to find one.
- for _, server_identifier in pairs(server_identifiers) do
- local server_name, version = servers.parse_server_identifier(server_identifier)
- local ok, server = servers.get_server(server_name)
- if not ok then
- raise_error(("Could not find server %q."):format(server_name))
- end
- table.insert(server_tuples, { server, version })
- end
-
- -- Start all installations.
- for _, server_tuple in ipairs(server_tuples) do
- local server, version = unpack(server_tuple)
-
- server:install_attached({
- stdio_sink = process.simple_sink(),
- requested_server_version = version,
- }, function(success)
- table.insert(completed_servers, server)
- if not success then
- table.insert(failed_servers, server)
- end
- end)
- end
-
- -- Poll for completion.
- if not vim.wait(60000 * 15, function()
- return #completed_servers >= #server_identifiers
- end, 100) then
- raise_error "Timed out waiting for server(s) to complete installing."
- end
-
- if #failed_servers > 0 then
- for _, server in pairs(failed_servers) do
- log.fmt_error("Server %s failed to install.", server.name)
- end
- raise_error(("%d/%d servers failed to install."):format(#failed_servers, #completed_servers))
- end
-
- for _, server in pairs(completed_servers) do
- log.fmt_info("Server %s was successfully installed.", server.name)
- end
-end
-
----Unnstalls the provided servers synchronously (blocking call). It's recommended to only use this in headless environments.
----@param server_identifiers string[] @A list of server identifiers (for example {"rust_analyzer@nightly", "tsserver"}).
-function M.uninstall_sync(server_identifiers)
- for _, server_identifier in pairs(server_identifiers) do
- local server_name = servers.parse_server_identifier(server_identifier)
- local ok, server = servers.get_server(server_name)
- if not ok then
- log.error(server)
- raise_error(("Could not find server %q."):format(server_name))
- end
- local uninstall_ok, uninstall_error = pcall(server.uninstall, server)
- if not uninstall_ok then
- log.error(tostring(uninstall_error))
- raise_error(("Failed to uninstall server %q."):format(server.name))
- end
- log.fmt_info("Successfully uninstalled server %s.", server.name)
- end
-end
-
----@param server_name string
----@param callback fun(server_name: string, version: string|nil)
----@return string,string|nil
-local function resolve_language_alias(server_name, callback)
- local language_aliases = language_autocomplete_map[server_name]
- if language_aliases then
- vim.ui.select(language_aliases, {
- prompt = ("Please select which %q server you want to install:"):format(server_name),
- }, function(choice)
- if choice then
- callback(choice)
- end
- end)
- else
- callback(server_name)
- end
-end
-
----Will prompt the user via vim.ui.select() to select which server associated with the provided filetype to install.
----If the provided filetype is not associated with a server, an error message will be displayed.
----@param filetype string
-function M.install_by_filetype(filetype)
- local servers_by_filetype = filetype_server_map[filetype]
- if servers_by_filetype then
- vim.ui.select(servers_by_filetype, {
- prompt = ("Please select which server you want to install for filetype %q:"):format(filetype),
- }, function(choice)
- if choice then
- M.install(choice)
- end
- end)
- else
- notify(("No LSP servers found for filetype %q"):format(filetype), vim.log.levels.WARN)
- end
-end
-
---- Queues a server to be installed. Will also open the status window.
----@param server_identifier string @The server to install. This can also include a requested version, for example "rust_analyzer@nightly".
-function M.install(server_identifier)
- local server_name, version = servers.parse_server_identifier(server_identifier)
- resolve_language_alias(server_name, function(resolved_server_name)
- if not resolved_server_name then
- -- No selection was made
- return
- end
- local ok, server = servers.get_server(resolved_server_name)
- if not ok then
- return notify(
- ("Unable to find LSP server %s.\n\n%s"):format(resolved_server_name, server),
- vim.log.levels.ERROR
- )
- end
- status_win().install_server(server, version)
- status_win().open()
- end)
-end
-
---- Queues a server to be uninstalled. Will also open the status window.
----@param server_name string The server to uninstall.
-function M.uninstall(server_name)
- local ok, server = servers.get_server(server_name)
- if not ok then
- return notify(("Unable to find LSP server %s.\n\n%s"):format(server_name, server), vim.log.levels.ERROR)
- end
- status_win().uninstall_server(server)
- status_win().open()
-end
-
---- Queues all servers to be uninstalled. Will also open the status window.
-function M.uninstall_all(no_confirm)
- if not no_confirm then
- local choice = vim.fn.confirm(
- ("This will uninstall all servers currently installed at %q. Continue?"):format(
- vim.fn.fnamemodify(settings.current.install_root_dir, ":~")
- ),
- "&Yes\n&No",
- 2
- )
- if settings.current.install_root_dir ~= settings._DEFAULT_SETTINGS.install_root_dir then
- choice = vim.fn.confirm(
- (
- "WARNING: You are using a non-default install_root_dir (%q). This command will delete the entire directory. Continue?"
- ):format(vim.fn.fnamemodify(settings.current.install_root_dir, ":~")),
- "&Yes\n&No",
- 2
- )
- end
-
- if choice ~= 1 then
- print "Uninstalling all servers was aborted."
- return
- end
- end
-
- log.info "Uninstalling all servers."
- if fs.sync.dir_exists(settings.current.install_root_dir) then
- local ok, err = pcall(fs.sync.rmrf, settings.current.install_root_dir)
- if not ok then
- log.error(err)
- raise_error "Failed to uninstall all servers."
- end
- end
- log.info "Successfully uninstalled all servers."
- status_win().mark_all_servers_uninstalled()
- status_win().open()
-end
-
----@deprecated Setup servers directly via lspconfig instead. See https://github.com/williamboman/nvim-lsp-installer/discussions/636
----@param cb fun(server: Server) @Callback to be executed whenever a server is ready to be set up.
-function M.on_server_ready(cb)
- assert(
- not settings.uses_new_setup,
- "Please set up servers directly via lspconfig instead of using .on_server_ready() (this method is now deprecated)! Refer to :h nvim-lsp-installer-quickstart for more information."
- )
- dispatcher.register_server_ready_callback(cb)
- vim.schedule(function()
- local installed_servers = servers.get_installed_servers()
- for i = 1, #installed_servers do
- dispatcher.dispatch_server_ready(installed_servers[i])
- end
- end)
-end
-
-M.get_server = servers.get_server
-M.get_available_servers = servers.get_available_servers
-M.get_installed_servers = servers.get_installed_servers
-M.get_uninstalled_servers = servers.get_uninstalled_servers
-M.register = servers.register
-
-return M
diff --git a/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua b/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua
deleted file mode 100644
index 67c87cfe..00000000
--- a/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua
+++ /dev/null
@@ -1,47 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {
- OpenFOAM = { "foam_ls" },
- R = { "r_language_server" },
- V = { "vls" },
- ["assembly-gas"] = { "asm_lsp" },
- ["assembly-go"] = { "asm_lsp" },
- ["assembly-nasm"] = { "asm_lsp" },
- c = { "ccls", "clangd" },
- ["c#"] = { "csharp_ls", "omnisharp" },
- ["c++"] = { "ccls", "clangd" },
- crystal = { "crystalline", "scry" },
- css = { "cssls", "cssmodules_ls" },
- d = { "serve_d" },
- ["f#"] = { "fsautocomplete" },
- fortran = { "fortls" },
- go = { "golangci_lint_ls", "gopls" },
- haskell = { "hls" },
- java = { "jdtls" },
- javascript = { "eslint", "quick_lint_js", "rome", "tsserver" },
- latex = { "ltex", "texlab" },
- liquid = { "theme_check" },
- lua = { "sumneko_lua" },
- markdown = { "marksman", "prosemd_lsp", "remark_ls", "zk" },
- ["metamath-zero"] = { "mm0_ls" },
- nix = { "rnix" },
- ["objective-c"] = { "ccls" },
- onescript = { "bsl_ls" },
- php = { "intelephense", "phpactor", "psalm" },
- python = { "jedi_language_server", "pylsp", "pyright", "sourcery" },
- ruby = { "solargraph", "sorbet" },
- sls = { "salt_ls" },
- solidity = { "solang", "solc", "solidity_ls" },
- sphinx = { "esbonio" },
- sql = { "sqlls", "sqls" },
- swift = { "sourcekit" },
- systemverilog = { "svlangserver", "svls", "verible" },
- terraform = { "terraformls", "tflint" },
- toml = { "taplo" },
- typescript = { "eslint", "rome", "tsserver" },
- verilog = { "verible" },
- vlang = { "vls" },
- vue = { "volar", "vuels" },
- xml = { "lemminx" },
- zig = { "zls" }
-} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/metadata.lua b/lua/nvim-lsp-installer/_generated/metadata.lua
deleted file mode 100644
index 7cd33c63..00000000
--- a/lua/nvim-lsp-installer/_generated/metadata.lua
+++ /dev/null
@@ -1,373 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {
- angularls = {
- filetypes = { "typescript", "html", "typescriptreact", "typescript.tsx" }
- },
- ansiblels = {
- filetypes = { "yaml.ansible" }
- },
- apex_ls = {
- filetypes = { "apexcode" }
- },
- arduino_language_server = {
- filetypes = { "arduino" }
- },
- asm_lsp = {
- filetypes = { "asm", "vmasm" }
- },
- astro = {
- filetypes = { "astro" }
- },
- awk_ls = {
- filetypes = { "awk" }
- },
- bashls = {
- filetypes = { "sh" }
- },
- beancount = {
- filetypes = { "beancount", "bean" }
- },
- bicep = {
- filetypes = { "bicep" }
- },
- bsl_ls = {
- filetypes = { "bsl", "os" }
- },
- ccls = {
- filetypes = { "c", "cpp", "objc", "objcpp" }
- },
- clangd = {
- filetypes = { "c", "cpp", "objc", "objcpp", "cuda" }
- },
- clarity_lsp = {
- filetypes = { "clar", "clarity" }
- },
- clojure_lsp = {
- filetypes = { "clojure", "edn" }
- },
- cmake = {
- filetypes = { "cmake" }
- },
- codeqlls = {
- filetypes = { "ql" }
- },
- crystalline = {
- filetypes = { "crystal" }
- },
- csharp_ls = {
- filetypes = { "cs" }
- },
- cssls = {
- filetypes = { "css", "scss", "less" }
- },
- cssmodules_ls = {
- filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact" }
- },
- cucumber_language_server = {
- filetypes = { "cucumber" }
- },
- dartls = {
- filetypes = { "dart" }
- },
- denols = {
- filetypes = { "javascript", "javascriptreact", "javascript.jsx", "typescript", "typescriptreact", "typescript.tsx" }
- },
- dhall_lsp_server = {
- filetypes = { "dhall" }
- },
- diagnosticls = {
- filetypes = {}
- },
- dockerls = {
- filetypes = { "dockerfile" }
- },
- dotls = {
- filetypes = { "dot" }
- },
- efm = {
- filetypes = {}
- },
- elixirls = {
- filetypes = { "elixir", "eelixir", "heex" }
- },
- elmls = {
- filetypes = { "elm" }
- },
- ember = {
- filetypes = { "handlebars", "typescript", "javascript" }
- },
- emmet_ls = {
- filetypes = { "html", "css" }
- },
- erlangls = {
- filetypes = { "erlang" }
- },
- esbonio = {
- filetypes = { "rst" }
- },
- eslint = {
- filetypes = { "javascript", "javascriptreact", "javascript.jsx", "typescript", "typescriptreact", "typescript.tsx", "vue" }
- },
- flux_lsp = {
- filetypes = { "flux" }
- },
- foam_ls = {
- filetypes = { "foam", "OpenFOAM" }
- },
- fortls = {
- filetypes = { "fortran" }
- },
- fsautocomplete = {
- filetypes = { "fsharp" }
- },
- golangci_lint_ls = {
- filetypes = { "go", "gomod" }
- },
- gopls = {
- filetypes = { "go", "gomod", "gotmpl" }
- },
- grammarly = {
- filetypes = { "markdown" }
- },
- graphql = {
- filetypes = { "graphql", "typescriptreact", "javascriptreact" }
- },
- groovyls = {
- filetypes = { "groovy" }
- },
- haxe_language_server = {
- filetypes = { "haxe" }
- },
- hls = {
- filetypes = { "haskell", "lhaskell" }
- },
- hoon_ls = {
- filetypes = { "hoon" }
- },
- html = {
- filetypes = { "html" }
- },
- intelephense = {
- filetypes = { "php" }
- },
- jdtls = {
- filetypes = { "java" }
- },
- jedi_language_server = {
- filetypes = { "python" }
- },
- jsonls = {
- filetypes = { "json", "jsonc" }
- },
- jsonnet_ls = {
- filetypes = { "jsonnet", "libsonnet" }
- },
- julials = {
- filetypes = { "julia" }
- },
- kotlin_language_server = {
- filetypes = { "kotlin" }
- },
- lelwel_ls = {
- filetypes = { "llw" }
- },
- lemminx = {
- filetypes = { "xml", "xsd", "xsl", "xslt", "svg" }
- },
- ltex = {
- filetypes = { "bib", "gitcommit", "markdown", "org", "plaintex", "rst", "rnoweb", "tex" }
- },
- marksman = {
- filetypes = { "markdown" }
- },
- mm0_ls = {
- filetypes = { "metamath-zero" }
- },
- nickel_ls = {
- filetypes = { "ncl", "nickel" }
- },
- nimls = {
- filetypes = { "nim" }
- },
- ocamlls = {
- filetypes = { "ocaml", "reason" }
- },
- ocamllsp = {
- filetypes = { "ocaml", "ocaml.menhir", "ocaml.interface", "ocaml.ocamllex", "reason", "dune" }
- },
- omnisharp = {
- filetypes = { "cs", "vb" }
- },
- opencl_ls = {
- filetypes = { "opencl" }
- },
- perlnavigator = {
- filetypes = { "perl" }
- },
- phpactor = {
- filetypes = { "php" }
- },
- powershell_es = {
- filetypes = { "ps1" }
- },
- prismals = {
- filetypes = { "prisma" }
- },
- prosemd_lsp = {
- filetypes = { "markdown" }
- },
- psalm = {
- filetypes = { "php" }
- },
- puppet = {
- filetypes = { "puppet" }
- },
- purescriptls = {
- filetypes = { "purescript" }
- },
- pylsp = {
- filetypes = { "python" }
- },
- pyright = {
- filetypes = { "python" }
- },
- quick_lint_js = {
- filetypes = { "javascript" }
- },
- r_language_server = {
- filetypes = { "r", "rmd" }
- },
- reason_ls = {
- filetypes = { "reason" }
- },
- remark_ls = {
- filetypes = { "markdown" }
- },
- rescriptls = {
- filetypes = { "rescript" }
- },
- rnix = {
- filetypes = { "nix" }
- },
- robotframework_ls = {
- filetypes = { "robot" }
- },
- rome = {
- filetypes = { "javascript", "javascriptreact", "json", "typescript", "typescript.tsx", "typescriptreact" }
- },
- rust_analyzer = {
- filetypes = { "rust" }
- },
- salt_ls = {
- filetypes = { "sls" }
- },
- scry = {
- filetypes = { "crystal" }
- },
- serve_d = {
- filetypes = { "d" }
- },
- slint_lsp = {
- filetypes = { "slint" }
- },
- solang = {
- filetypes = { "solidity" }
- },
- solargraph = {
- filetypes = { "ruby" }
- },
- solc = {
- filetypes = { "solidity" }
- },
- solidity_ls = {
- filetypes = { "solidity" }
- },
- sorbet = {
- filetypes = { "ruby" }
- },
- sourcekit = {
- filetypes = { "swift", "c", "cpp", "objective-c", "objective-cpp" }
- },
- sourcery = {
- filetypes = { "python" }
- },
- sqlls = {
- filetypes = { "sql", "mysql" }
- },
- sqls = {
- filetypes = { "sql", "mysql" }
- },
- stylelint_lsp = {
- filetypes = { "css", "less", "scss", "sugarss", "vue", "wxss", "javascript", "javascriptreact", "typescript", "typescriptreact" }
- },
- sumneko_lua = {
- filetypes = { "lua" }
- },
- svelte = {
- filetypes = { "svelte" }
- },
- svlangserver = {
- filetypes = { "verilog", "systemverilog" }
- },
- svls = {
- filetypes = { "verilog", "systemverilog" }
- },
- tailwindcss = {
- filetypes = { "aspnetcorerazor", "astro", "astro-markdown", "blade", "django-html", "htmldjango", "edge", "eelixir", "ejs", "erb", "eruby", "gohtml", "haml", "handlebars", "hbs", "html", "html-eex", "heex", "jade", "leaf", "liquid", "markdown", "mdx", "mustache", "njk", "nunjucks", "php", "razor", "slim", "twig", "css", "less", "postcss", "sass", "scss", "stylus", "sugarss", "javascript", "javascriptreact", "reason", "rescript", "typescript", "typescriptreact", "vue", "svelte" }
- },
- taplo = {
- filetypes = { "toml" }
- },
- teal_ls = {
- filetypes = { "teal" }
- },
- terraformls = {
- filetypes = { "terraform" }
- },
- texlab = {
- filetypes = { "tex", "bib" }
- },
- tflint = {
- filetypes = { "terraform" }
- },
- theme_check = {
- filetypes = { "liquid" }
- },
- tsserver = {
- filetypes = { "javascript", "javascriptreact", "javascript.jsx", "typescript", "typescriptreact", "typescript.tsx" }
- },
- vala_ls = {
- filetypes = { "vala", "genie" }
- },
- verible = {
- filetypes = { "systemverilog", "verilog" }
- },
- vimls = {
- filetypes = { "vim" }
- },
- visualforce_ls = {
- filetypes = { "visualforce" }
- },
- vls = {
- filetypes = { "vlang" }
- },
- volar = {
- filetypes = { "vue" }
- },
- vuels = {
- filetypes = { "vue" }
- },
- wgsl_analyzer = {
- filetypes = { "wgsl" }
- },
- yamlls = {
- filetypes = { "yaml", "yaml.docker-compose" }
- },
- zk = {
- filetypes = { "markdown" }
- },
- zls = {
- filetypes = { "zig", "zir" }
- }
-} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/jdtls.lua b/lua/nvim-lsp-installer/_generated/schemas/jdtls.lua
deleted file mode 100644
index 44bd45f8..00000000
--- a/lua/nvim-lsp-installer/_generated/schemas/jdtls.lua
+++ /dev/null
@@ -1,3 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {properties = {["java.autobuild.enabled"] = {default = true,description = "Enable/disable the 'auto build'",scope = "window",type = "boolean"},["java.codeGeneration.generateComments"] = {default = false,description = "Generate method comments when generating the methods.",scope = "window",type = "boolean"},["java.codeGeneration.hashCodeEquals.useInstanceof"] = {default = false,description = "Use 'instanceof' to compare types when generating the hashCode and equals methods.",scope = "window",type = "boolean"},["java.codeGeneration.hashCodeEquals.useJava7Objects"] = {default = false,description = "Use Objects.hash and Objects.equals when generating the hashCode and equals methods. This setting only applies to Java 7 and higher.",scope = "window",type = "boolean"},["java.codeGeneration.insertionLocation"] = {default = "afterCursor",description = "Specifies the insertion location of the code generated by source actions.",enum = { "afterCursor", "beforeCursor", "lastMember" },enumDescriptions = { "Insert the generated code after the member where the cursor is located.", "Insert the generated code before the member where the cursor is located.", "Insert the generated code as the last member of the target type." },scope = "window",type = "string"},["java.codeGeneration.toString.codeStyle"] = {default = "STRING_CONCATENATION",description = "The code style for generating the toString method.",enum = { "STRING_CONCATENATION", "STRING_BUILDER", "STRING_BUILDER_CHAINED", "STRING_FORMAT" },enumDescriptions = { "String concatenation", "StringBuilder/StringBuffer", "StringBuilder/StringBuffer - chained call", "String.format/MessageFormat" },type = "string"},["java.codeGeneration.toString.limitElements"] = {default = 0,description = "Limit number of items in arrays/collections/maps to list, if 0 then list all.",scope = "window",type = "integer"},["java.codeGeneration.toString.listArrayContents"] = {default = true,description = "List contents of arrays instead of using native toString().",scope = "window",type = "boolean"},["java.codeGeneration.toString.skipNullValues"] = {default = false,description = "Skip null values when generating the toString method.",scope = "window",type = "boolean"},["java.codeGeneration.toString.template"] = {default = "${object.className} [${member.name()}=${member.value}, ${otherMembers}]",description = "The template for generating the toString method.",type = "string"},["java.codeGeneration.useBlocks"] = {default = false,description = "Use blocks in 'if' statements when generating the methods.",scope = "window",type = "boolean"},["java.completion.enabled"] = {default = true,description = "Enable/disable code completion support",scope = "window",type = "boolean"},["java.completion.favoriteStaticMembers"] = {default = { "org.junit.Assert.*", "org.junit.Assume.*", "org.junit.jupiter.api.Assertions.*", "org.junit.jupiter.api.Assumptions.*", "org.junit.jupiter.api.DynamicContainer.*", "org.junit.jupiter.api.DynamicTest.*", "org.mockito.Mockito.*", "org.mockito.ArgumentMatchers.*", "org.mockito.Answers.*" },description = "Defines a list of static members or types with static members. Content assist will propose those static members even if the import is missing.",scope = "window",type = "array"},["java.completion.filteredTypes"] = {default = { "java.awt.*", "com.sun.*", "sun.*", "jdk.*", "org.graalvm.*", "io.micrometer.shaded.*" },description = "Defines the type filters. All types whose fully qualified name matches the selected filter strings will be ignored in content assist or quick fix proposals and when organizing imports. For example 'java.awt.*' will hide all types from the awt packages.",scope = "window",type = "array"},["java.completion.guessMethodArguments"] = {default = false,description = "When set to true, method arguments are guessed when a method is selected from as list of code assist proposals.",scope = "window",type = "boolean"},["java.completion.importOrder"] = {default = { "java", "javax", "org", "com" },description = "Defines the sorting order of import statements. A package or type name prefix (e.g. 'org.eclipse') is a valid entry. An import is always added to the most specific group.",scope = "window",type = "array"},["java.completion.maxResults"] = {default = 0,markdownDescription = "Maximum number of completion results (not including snippets).\n`0` (the default value) disables the limit, all results are returned. In case of performance problems, consider setting a sensible limit.",scope = "window",type = "integer"},["java.configuration.checkProjectSettingsExclusions"] = {default = false,deprecationMessage = "Please use 'java.import.generatesMetadataFilesAtProjectRoot' to control whether to generate the project metadata files at the project root. And use 'files.exclude' to control whether to hide the project metadata files from the file explorer.",description = "Controls whether to exclude extension-generated project settings files (.project, .classpath, .factorypath, .settings/) from the file explorer.",scope = "window",type = "boolean"},["java.configuration.maven.globalSettings"] = {default = vim.NIL,description = "Path to Maven's global settings.xml",scope = "window",type = "string"},["java.configuration.maven.notCoveredPluginExecutionSeverity"] = {default = "warning",description = "Specifies severity if the plugin execution is not covered by Maven build lifecycle.",enum = { "ignore", "warning", "error" },scope = "window",type = "string"},["java.configuration.maven.userSettings"] = {default = vim.NIL,description = "Path to Maven's user settings.xml",scope = "window",type = "string"},["java.configuration.runtimes"] = {default = {},description = "Map Java Execution Environments to local JDKs.",items = {additionalProperties = false,default = vim.empty_dict(),properties = {default = {description = "Is default runtime? Only one runtime can be default.",type = "boolean"},javadoc = {description = "JDK javadoc path.",type = "string"},name = {description = "Java Execution Environment name. Must be unique.",enum = { "J2SE-1.5", "JavaSE-1.6", "JavaSE-1.7", "JavaSE-1.8", "JavaSE-9", "JavaSE-10", "JavaSE-11", "JavaSE-12", "JavaSE-13", "JavaSE-14", "JavaSE-15", "JavaSE-16", "JavaSE-17", "JavaSE-18" },type = "string"},path = {description = 'JDK home path. Should be the JDK installation directory, not the Java bin path.\n On Windows, backslashes must be escaped, i.e.\n"path":"C:\\\\Program Files\\\\Java\\\\jdk1.8.0_161".',pattern = ".*(?<!\\/bin|\\/bin\\/|\\\\bin|\\\\bin\\\\)$",type = "string"},sources = {description = "JDK sources path.",type = "string"}},required = { "path", "name" },type = "object"},scope = "machine-overridable",type = "array"},["java.configuration.updateBuildConfiguration"] = {default = "interactive",description = "Specifies how modifications on build files update the Java classpath/configuration",enum = { "disabled", "interactive", "automatic" },scope = "window",type = { "string" }},["java.configuration.workspaceCacheLimit"] = {default = 90,description = "The number of days (if enabled) to keep unused workspace cache data. Beyond this limit, cached workspace data may be removed.",minimum = 1,scope = "application",type = { "null", "integer" }},["java.contentProvider.preferred"] = {default = vim.NIL,description = "Preferred content provider (a 3rd party decompiler id, usually)",scope = "window",type = "string"},["java.eclipse.downloadSources"] = {default = false,description = "Enable/disable download of Maven source artifacts for Eclipse projects.",scope = "window",type = "boolean"},["java.errors.incompleteClasspath.severity"] = {default = "warning",description = "Specifies the severity of the message when the classpath is incomplete for a Java file",enum = { "ignore", "info", "warning", "error" },scope = "window",type = { "string" }},["java.foldingRange.enabled"] = {default = true,description = "Enable/disable smart folding range support. If disabled, it will use the default indentation-based folding range provided by VS Code.",scope = "window",type = "boolean"},["java.format.comments.enabled"] = {default = true,description = "Includes the comments during code formatting.",scope = "window",type = "boolean"},["java.format.enabled"] = {default = true,description = "Enable/disable default Java formatter",scope = "window",type = "boolean"},["java.format.onType.enabled"] = {default = true,description = "Enable/disable automatic block formatting when typing `;`, `<enter>` or `}`",scope = "window",type = "boolean"},["java.format.settings.profile"] = {default = vim.NIL,description = "Optional formatter profile name from the Eclipse formatter settings.",scope = "window",type = "string"},["java.format.settings.url"] = {default = vim.NIL,markdownDescription = "Specifies the url or file path to the [Eclipse formatter xml settings](https://github.com/redhat-developer/vscode-java/wiki/Formatter-settings).",scope = "window",type = "string"},["java.home"] = {default = vim.NIL,deprecationMessage = "This setting is deprecated, please use 'java.jdt.ls.java.home' instead.",description = 'Specifies the folder path to the JDK (11 or more recent) used to launch the Java Language Server.\nOn Windows, backslashes must be escaped, i.e.\n"java.home":"C:\\\\Program Files\\\\Java\\\\jdk11.0_8"',scope = "machine-overridable",type = { "string", "null" }},["java.implementationsCodeLens.enabled"] = {default = false,description = "Enable/disable the implementations code lens.",scope = "window",type = "boolean"},["java.import.exclusions"] = {default = { "**/node_modules/**", "**/.metadata/**", "**/archetype-resources/**", "**/META-INF/maven/**" },description = "Configure glob patterns for excluding folders. Use `!` to negate patterns to allow subfolders imports. You have to include a parent directory. The order is important.",scope = "window",type = "array"},["java.import.generatesMetadataFilesAtProjectRoot"] = {default = false,markdownDescription = "Specify whether the project metadata files(.project, .classpath, .factorypath, .settings/) will be generated at the project root. Click [HERE](command:_java.metadataFilesGeneration) to learn how to change the setting to make it take effect.",scope = "window",type = "boolean"},["java.import.gradle.arguments"] = {default = vim.NIL,description = "Arguments to pass to Gradle.",scope = "machine",type = "string"},["java.import.gradle.enabled"] = {default = true,description = "Enable/disable the Gradle importer.",scope = "window",type = "boolean"},["java.import.gradle.home"] = {default = vim.NIL,description = "Use Gradle from the specified local installation directory or GRADLE_HOME if the Gradle wrapper is missing or disabled and no 'java.import.gradle.version' is specified.",scope = "window",type = "string"},["java.import.gradle.java.home"] = {default = vim.NIL,description = "The location to the JVM used to run the Gradle daemon.",scope = "machine",type = "string"},["java.import.gradle.jvmArguments"] = {default = vim.NIL,description = "JVM arguments to pass to Gradle.",scope = "machine",type = "string"},["java.import.gradle.offline.enabled"] = {default = false,description = "Enable/disable the Gradle offline mode.",scope = "window",type = "boolean"},["java.import.gradle.user.home"] = {default = vim.NIL,description = "Setting for GRADLE_USER_HOME.",scope = "window",type = "string"},["java.import.gradle.version"] = {default = vim.NIL,description = "Use Gradle from the specific version if the Gradle wrapper is missing or disabled.",scope = "window",type = "string"},["java.import.gradle.wrapper.enabled"] = {default = true,description = "Use Gradle from the 'gradle-wrapper.properties' file.",scope = "window",type = "boolean"},["java.import.maven.enabled"] = {default = true,description = "Enable/disable the Maven importer.",scope = "window",type = "boolean"},["java.imports.gradle.wrapper.checksums"] = {default = {},description = "Defines allowed/disallowed SHA-256 checksums of Gradle Wrappers",items = {additionalProperties = false,default = vim.empty_dict(),properties = {allowed = {default = true,label = "Is allowed?",type = "boolean"},sha256 = {label = "SHA-256 checksum.",type = "string"}},required = { "sha256" },type = "object",uniqueItems = true},scope = "application",type = "array"},["java.inlayHints.parameterNames.enabled"] = {default = "literals",enum = { "none", "literals", "all" },enumDescriptions = { "Disable parameter name hints", "Enable parameter name hints only for literal arguments", "Enable parameter name hints for literal and non-literal arguments" },markdownDescription = "Enable/disable inlay hints for parameter names:\n```java\n\nInteger.valueOf(/* s: */ '123', /* radix: */ 10)\n \n```\n `#java.inlayHints.parameterNames.exclusions#` can be used to disable the inlay hints for methods.",scope = "window",type = "string"},["java.inlayHints.parameterNames.exclusions"] = {default = {},items = {type = "string"},markdownDescription = "The patterns for the methods that will be disabled to show the inlay hints. Supported pattern examples:\n - `java.lang.Math.*` - All the methods from java.lang.Math.\n - `*.Arrays.asList` - Methods named as 'asList' in the types named as 'Arrays'.\n - `*.println(*)` - Methods named as 'println'.\n - `(from, to)` - Methods with two parameters named as 'from' and 'to'.\n - `(arg*)` - Methods with one parameter whose name starts with 'arg'.",scope = "window",type = "array"},["java.jdt.ls.java.home"] = {default = vim.NIL,description = "Specifies the folder path to the JDK (11 or more recent) used to launch the Java Language Server. This setting will replace the Java extension's embedded JRE to start the Java Language Server. \n\nOn Windows, backslashes must be escaped, i.e.\n\"java.jdt.ls.java.home\":\"C:\\\\Program Files\\\\Java\\\\jdk11.0_8\"",scope = "machine-overridable",type = { "string", "null" }},["java.jdt.ls.vmargs"] = {default = "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m",description = "Specifies extra VM arguments used to launch the Java Language Server. Eg. use `-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m ` to optimize memory usage with the parallel garbage collector",scope = "machine-overridable",type = { "string", "null" }},["java.maven.downloadSources"] = {default = false,description = "Enable/disable download of Maven source artifacts as part of importing Maven projects.",scope = "window",type = "boolean"},["java.maven.updateSnapshots"] = {default = false,description = "Force update of Snapshots/Releases.",scope = "window",type = "boolean"},["java.maxConcurrentBuilds"] = {default = 1,description = "Max simultaneous project builds",minimum = 1,scope = "window",type = "integer"},["java.progressReports.enabled"] = {default = true,description = "[Experimental] Enable/disable progress reports from background processes on the server.",scope = "window",type = "boolean"},["java.project.encoding"] = {default = "ignore",enum = { "ignore", "warning", "setDefault" },enumDescriptions = { "Ignore project encoding settings", "Show warning if a project has no explicit encoding set", "Set the default workspace encoding settings" },markdownDescription = "Project encoding settings",scope = "window"},["java.project.importHint"] = {default = true,description = "Enable/disable the server-mode switch information, when Java projects import is skipped on startup.",scope = "application",type = "boolean"},["java.project.importOnFirstTimeStartup"] = {default = "automatic",description = "Specifies whether to import the Java projects, when opening the folder in Hybrid mode for the first time.",enum = { "disabled", "interactive", "automatic" },scope = "application",type = "string"},["java.project.outputPath"] = {default = "",markdownDescription = "A relative path to the workspace where stores the compiled output. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project.",scope = "window",type = { "string", "null" }},["java.project.referencedLibraries"] = {additionalProperties = false,default = { "lib/**/*.jar" },description = "Configure glob patterns for referencing local libraries to a Java project.",properties = {exclude = {type = "array"},include = {type = "array"},sources = {type = "object"}},required = { "include" },scope = "window",type = { "array", "object" }},["java.project.resourceFilters"] = {default = { "node_modules", ".git" },description = "Excludes files and folders from being refreshed by the Java Language Server, which can improve the overall performance. For example, [\"node_modules\",\".git\"] will exclude all files and folders named 'node_modules' or '.git'. Defaults to [\"node_modules\",\".git\"].",scope = "window",type = "array"},["java.project.sourcePaths"] = {default = {},items = {type = "string"},markdownDescription = "Relative paths to the workspace where stores the source files. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project.",scope = "window",type = "array"},["java.quickfix.showAt"] = {default = "line",description = "Show quickfixes at the problem or line level.",enum = { "line", "problem" },scope = "window",type = "string"},["java.recommendations.dependency.analytics.show"] = {default = true,description = "Show the recommended Dependency Analytics extension.",scope = "window",type = "boolean"},["java.references.includeAccessors"] = {default = true,description = "Include getter, setter and builder/constructor when finding references.",scope = "window",type = "boolean"},["java.references.includeDecompiledSources"] = {default = true,description = "Include the decompiled sources when finding references.",scope = "window",type = "boolean"},["java.referencesCodeLens.enabled"] = {default = false,description = "Enable/disable the references code lens.",scope = "window",type = "boolean"},["java.saveActions.organizeImports"] = {default = false,description = "Enable/disable auto organize imports on save action",scope = "window",type = "boolean"},["java.selectionRange.enabled"] = {default = true,description = "Enable/disable Smart Selection support for Java. Disabling this option will not affect the VS Code built-in word-based and bracket-based smart selection.",scope = "window",type = "boolean"},["java.server.launchMode"] = {default = "Hybrid",description = "The launch mode for the Java extension",enum = { "Standard", "LightWeight", "Hybrid" },enumDescriptions = { "Provides full features such as intellisense, refactoring, building, Maven/Gradle support etc.", "Starts a syntax server with lower start-up cost. Only provides syntax features such as outline, navigation, javadoc, syntax errors.", "Provides full features with better responsiveness. It starts a standard language server and a secondary syntax server. The syntax server provides syntax features until the standard server is ready." },scope = "window",type = "string"},["java.settings.url"] = {default = vim.NIL,markdownDescription = "Specifies the url or file path to the workspace Java settings. See [Setting Global Preferences](https://github.com/redhat-developer/vscode-java/wiki/Settings-Global-Preferences)",scope = "window",type = "string"},["java.showBuildStatusOnStart.enabled"] = {anyOf = { {enum = { "notification", "terminal", "off" },enumDescriptions = { "Show the build status via progress notification on start", "Show the build status via terminal on start", "Do not show any build status on start" }}, "boolean" },default = "notification",description = "Automatically show build status on startup.",scope = "window"},["java.signatureHelp.description.enabled"] = {default = false,description = "Enable/disable to show the description in signature help.",scope = "window",type = "boolean"},["java.signatureHelp.enabled"] = {default = false,description = "Enable/disable the signature help.",scope = "window",type = "boolean"},["java.sources.organizeImports.starThreshold"] = {default = 99,description = "Specifies the number of imports added before a star-import declaration is used.",minimum = 1,scope = "window",type = "integer"},["java.sources.organizeImports.staticStarThreshold"] = {default = 99,description = "Specifies the number of static imports added before a star-import declaration is used.",minimum = 1,scope = "window",type = "integer"},["java.symbols.includeSourceMethodDeclarations"] = {default = false,markdownDescription = "Include method declarations from source files in symbol search.",scope = "window",type = "boolean"},["java.templates.fileHeader"] = {default = {},markdownDescription = "Specifies the file header comment for new Java file. Supports configuring multi-line comments with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).",scope = "window",type = "array"},["java.templates.typeComment"] = {default = {},markdownDescription = "Specifies the type comment for new Java type. Supports configuring multi-line comments with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).",scope = "window",type = "array"},["java.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the Java language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["java.typeHierarchy.lazyLoad"] = {default = false,description = "Enable/disable lazy loading the content in type hierarchy. Lazy loading could save a lot of loading time but every type should be expanded manually to load its content.",scope = "window",type = "boolean"}},title = "Java",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/julials.lua b/lua/nvim-lsp-installer/_generated/schemas/julials.lua
deleted file mode 100644
index 914041b6..00000000
--- a/lua/nvim-lsp-installer/_generated/schemas/julials.lua
+++ /dev/null
@@ -1,3 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {properties = {["julia.NumThreads"] = {default = vim.NIL,markdownDescription = "Number of threads to use for Julia processes. A value of `auto` works on Julia versions that allow for `--threads=auto`.",scope = "machine-overridable",type = { "integer", "string", "null" }},["julia.additionalArgs"] = {default = {},description = "Additional Julia arguments.",type = "array"},["julia.cellDelimiters"] = {default = { "^##(?!#)", "^#(\\s?)%%", "^#-" },description = "Cell delimiter regular expressions for Julia files.",type = "array"},["julia.completionmode"] = {default = "qualify",description = "Sets the mode for completions.",enum = { "exportedonly", "import", "qualify" },enumDescriptions = { "Show completions for the current namespace.", "Show completions for the current namespace and unexported variables of `using`ed modules. Selection of an unexported variable will result in the automatic insertion of an explicit `using` statement.", "Show completions for the current namespace and unexported variables of `using`ed modules. Selection of an unexported variable will complete to a qualified variable name." },scope = "window",type = "string"},["julia.debuggerDefaultCompiled"] = {default = { "Base.", "-Base.!", "-Base.all", "-Base.all!", "-Base.any", "-Base.any!", "-Base.cd", "-Base.iterate", "-Base.collect", "-Base.collect_similar", "-Base._collect", "-Base.collect_to!", "-Base.collect_to_with_first!", "-Base.filter", "-Base.filter!", "-Base.foreach", "-Base.findall", "-Base.findfirst", "-Base.findlast", "-Base.findnext", "-Base.findprev", "-Base.Generator", "-Base.map", "-Base.map!", "-Base.maximum!", "-Base.minimum!", "-Base.mktemp", "-Base.mktempdir", "-Base.open", "-Base.prod!", "-Base.redirect_stderr", "-Base.redirect_stdin", "-Base.redirect_stdout", "-Base.reenable_sigint", "-Base.setindex!", "-Base.setprecision", "-Base.setrounding", "-Base.show", "-Base.sprint", "-Base.sum", "-Base.sum!", "-Base.task_local_storage", "-Base.timedwait", "-Base.withenv", "-Base.Broadcast", "Core", "Core.Compiler.", "Core.IR", "Core.Intrinsics", "DelimitedFiles", "Distributed", "LinearAlgebra.", "Serialization", "Statistics", "-Statistics.mean", "SparseArrays", "Mmap" },description = "Functions or modules that are set to compiled mode when setting the defaults.",scope = "window",type = "array"},["julia.deleteJuliaCovFiles"] = {default = "true",description = "Delete Julia .cov files when running tests with coverage, leaving only a .lcov file behind.",scope = "window",type = "boolean"},["julia.editor"] = {default = "code",markdownDescription = "Command to open files from the REPL (via setting the `JULIA_EDITOR` environment variable).",type = "string"},["julia.enableCrashReporter"] = {default = vim.NIL,description = "Enable crash reports to be sent to the julia VS Code extension developers.",scope = "window",type = { "boolean", "null" }},["julia.enableTelemetry"] = {default = vim.NIL,description = "Enable usage data and errors to be sent to the julia VS Code extension developers.",scope = "window",type = { "boolean", "null" }},["julia.environmentPath"] = {default = vim.NIL,description = "Path to a julia environment. VS Code needs to be reloaded for changes to take effect.",scope = "window",type = { "string", "null" }},["julia.executablePath"] = {default = "",description = "Points to the julia executable.",scope = "machine-overridable",type = "string"},["julia.execution.codeInREPL"] = {default = false,description = "Print executed code in REPL and append it to the REPL history.",scope = "window",type = "boolean"},["julia.execution.inlineResultsForCellEvaluation"] = {default = false,markdownDescription = "Show separate inline results for all code blocks in a cell",scope = "window",type = "boolean"},["julia.execution.resultType"] = {default = "both",description = "Specifies how to show inline execution results",enum = { "REPL", "inline", "inline, errors in REPL", "both" },enumDescriptions = { "Shows inline execution results in REPL", "Shows inline execution results as inline bubbles", "Shows inline execution results in REPL and inline bubbles" },type = "string"},["julia.execution.saveOnEval"] = {default = false,markdownDescription = "Save file before execution",scope = "window",type = "boolean"},["julia.focusPlotNavigator"] = {default = false,description = "Whether to automatically show the plot navigator when plotting.",type = "boolean"},["julia.lint.call"] = {default = true,description = "This compares call signatures against all known methods for the called function. Calls with too many or too few arguments, or unknown keyword parameters are highlighted.",type = "boolean"},["julia.lint.constif"] = {default = true,description = "Check for constant conditionals in if statements that result in branches never being reached..",type = "boolean"},["julia.lint.datadecl"] = {default = true,description = "Check variables used in type declarations are datatypes.",type = "boolean"},["julia.lint.disabledDirs"] = {default = { "docs", "test" },markdownDescription = "Specifies sub-directories in [a package directory](https://docs.julialang.org/en/v1/manual/code-loading/#Package-directories-1) where only basic linting is. This drastically lowers the chance for false positives.",type = "array"},["julia.lint.iter"] = {default = true,description = "Check iterator syntax of loops. Will identify, for example, attempts to iterate over single values.",type = "boolean"},["julia.lint.lazy"] = {default = true,description = "Check for deterministic lazy boolean operators.",type = "boolean"},["julia.lint.missingrefs"] = {default = "none",description = "Highlight unknown symbols. The `symbols` option will not mark unknown fields.",enum = { "none", "symbols", "all" },type = "string"},["julia.lint.modname"] = {default = true,description = "Check submodule names do not shadow their parent's name.",type = "boolean"},["julia.lint.nothingcomp"] = {default = true,description = "Check for use of `==` rather than `===` when comparing against `nothing`. ",type = "boolean"},["julia.lint.pirates"] = {default = true,description = "Check for type piracy - the overloading of external functions with methods specified for external datatypes. 'External' here refers to imported code.",type = "boolean"},["julia.lint.run"] = {default = true,description = "Run the linter on active files.",type = "boolean"},["julia.lint.typeparam"] = {default = true,description = "Check parameters declared in `where` statements or datatype declarations are used.",type = "boolean"},["julia.lint.useoffuncargs"] = {default = true,description = "Check that all declared arguments are used within the function body.",type = "boolean"},["julia.liveTestFile"] = {default = "test/runtests.jl",description = "A workspace relative path to a Julia file that contains the tests that should be run for live testing.",scope = "window",type = "string"},["julia.packageServer"] = {default = "",markdownDescription = "Julia package server. Set's the `JULIA_PKG_SERVER` environment variable *before* starting a Julia process. Leave this empty to use the systemwide default. Requires a restart of the Julia process.",scope = "machine-overridable",type = "string"},["julia.persistentSession.alwaysCopy"] = {default = false,description = "Always copy the command for connecting to an external REPL to the clipboard.",scope = "machine-overridable",type = "boolean"},["julia.persistentSession.enabled"] = {default = false,markdownDescription = "Experimental: Starts the interactive Julia session in a persistent `tmux` session. Note that `tmux` must be available in the shell defined below. If present the string `$[workspace]` will be replaced with the current file's workspace when the REPL is first opened.",scope = "machine-overridable",type = "boolean"},["julia.persistentSession.shell"] = {default = "/bin/sh",description = "Shell used to start the persistent session.",scope = "machine-overridable",type = "string"},["julia.persistentSession.shellExecutionArgument"] = {default = "-c",markdownDescription = "Argument to execute code in the configured shell, e.g. `-c` for sh-likes or `/c` for `cmd`.",scope = "machine-overridable",type = "string"},["julia.persistentSession.tmuxSessionName"] = {default = "julia_vscode",markdownDescription = "Name of the `tmux` session.",scope = "machine-overridable",type = "string"},["julia.persistentSession.warnOnKill"] = {default = true,description = "Warn when stopping a persistent session.",scope = "machine-overridable",type = "boolean"},["julia.plots.path"] = {description = "The output directory to save plots to",scope = "window",type = "string"},["julia.runtimeCompletions"] = {default = false,description = "Request runtime completions from the integrated REPL.",scope = "application",type = "boolean"},["julia.showRuntimeDiagnostics"] = {default = true,markdownDescription = "Enable display of runtime diagnostics. These diagnostics are provided by packages that overload a `show` method for the `application/vnd.julia-vscode.diagnostics` MIME type.",type = "boolean"},["julia.symbolCacheDownload"] = {default = vim.NIL,description = "Download symbol server cache files from GitHub.",scope = "application",type = { "boolean", "null" }},["julia.symbolserverUpstream"] = {default = "https://www.julia-vscode.org/symbolcache",description = "Symbol server cache download URL.",scope = "application",type = "string"},["julia.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["julia.useCustomSysimage"] = {default = false,description = "Use an existing custom sysimage when starting the REPL",scope = "application",type = "boolean"},["julia.usePlotPane"] = {default = true,description = "Display plots within VS Code. Might require a restart of the Julia process.",type = "boolean"},["julia.useProgressFrontend"] = {default = true,markdownDescription = "Display [progress bars](https://github.com/JunoLab/ProgressLogging.jl) within VS Code.",type = "boolean"},["julia.useRevise"] = {default = true,description = "Load Revise.jl on startup of the REPL.",type = "boolean"}},title = "Julia",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/perlnavigator.lua b/lua/nvim-lsp-installer/_generated/schemas/perlnavigator.lua
deleted file mode 100644
index eba3ad99..00000000
--- a/lua/nvim-lsp-installer/_generated/schemas/perlnavigator.lua
+++ /dev/null
@@ -1,3 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {properties = {["perlnavigator.enableWarnings"] = {default = true,description = "Enable warnings using -Mwarnings command switch",scope = "resource",type = "boolean"},["perlnavigator.includePaths"] = {default = {},description = "Array of paths added to @INC. You can use $workspaceFolder as a placeholder.",scope = "resource",type = "array"},["perlnavigator.logging"] = {default = true,description = "Log to stdout from the navigator. Viewable in the Perl Navigator LSP log",scope = "resource",type = "boolean"},["perlnavigator.perlPath"] = {default = "perl",description = "Full path to the perl executable (no aliases, .bat files or ~/)",scope = "resource",type = "string"},["perlnavigator.perlcriticEnabled"] = {default = true,description = "Enable perl critic.",scope = "resource",type = "boolean"},["perlnavigator.perlcriticProfile"] = {default = "",description = "Path to perl critic profile. Otherwise perlcritic itself will default to ~/.perlcriticrc. (no aliases, .bat files or ~/)",scope = "resource",type = "string"},["perlnavigator.perltidyProfile"] = {default = "",description = "Path to perl tidy profile (no aliases, .bat files or ~/)",scope = "resource",type = "string"},["perlnavigator.severity1"] = {default = "hint",description = "Editor Diagnostic severity level for Critic severity 1",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.severity2"] = {default = "hint",description = "Editor Diagnostic severity level for Critic severity 2",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.severity3"] = {default = "hint",description = "Editor Diagnostic severity level for Critic severity 3",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.severity4"] = {default = "info",description = "Editor Diagnostic severity level for Critic severity 4",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.severity5"] = {default = "warning",description = "Editor Diagnostic severity level for Critic severity 5",enum = { "error", "warning", "info", "hint", "none" },scope = "resource",type = "string"},["perlnavigator.trace.server"] = {default = "messages",description = "Traces the communication between VS Code and the language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"}},title = "Perl Navigator",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/pylsp.lua b/lua/nvim-lsp-installer/_generated/schemas/pylsp.lua
deleted file mode 100644
index a0a50ea0..00000000
--- a/lua/nvim-lsp-installer/_generated/schemas/pylsp.lua
+++ /dev/null
@@ -1,3 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {["$schema"] = "http://json-schema.org/draft-07/schema#",description = "This server can be configured using `workspace/didChangeConfiguration` method. Each configuration option is described below:",properties = {["pylsp.configurationSources"] = {default = { "pycodestyle" },description = "List of configuration sources to use.",items = {enum = { "pycodestyle", "pyflakes" },type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.flake8.config"] = {default = vim.NIL,description = "Path to the config file that will be the authoritative config source.",type = "string"},["pylsp.plugins.flake8.enabled"] = {default = false,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.flake8.exclude"] = {default = vim.NIL,description = "List of files or directories to exclude.",type = "array"},["pylsp.plugins.flake8.executable"] = {default = "flake8",description = "Path to the flake8 executable.",type = "string"},["pylsp.plugins.flake8.filename"] = {default = vim.NIL,description = "Only check for filenames matching the patterns in this list.",type = "string"},["pylsp.plugins.flake8.hangClosing"] = {default = vim.NIL,description = "Hang closing bracket instead of matching indentation of opening bracket's line.",type = "boolean"},["pylsp.plugins.flake8.ignore"] = {default = vim.NIL,description = "List of errors and warnings to ignore (or skip).",type = "array"},["pylsp.plugins.flake8.indentSize"] = {default = vim.NIL,description = "Set indentation spaces.",type = "integer"},["pylsp.plugins.flake8.maxLineLength"] = {default = vim.NIL,description = "Maximum allowed line length for the entirety of this run.",type = "integer"},["pylsp.plugins.flake8.perFileIgnores"] = {default = vim.NIL,description = 'A pairing of filenames and violation codes that defines which violations to ignore in a particular file, for example: `["file_path.py:W305,W304"]`).',type = "array"},["pylsp.plugins.flake8.select"] = {default = vim.NIL,description = "List of errors and warnings to enable.",type = "array"},["pylsp.plugins.jedi.env_vars"] = {default = vim.NIL,description = "Define environment variables for jedi.Script and Jedi.names.",type = "object"},["pylsp.plugins.jedi.environment"] = {default = vim.NIL,description = "Define environment for jedi.Script and Jedi.names.",type = "string"},["pylsp.plugins.jedi.extra_paths"] = {default = {},description = "Define extra paths for jedi.Script.",type = "array"},["pylsp.plugins.jedi_completion.cache_for"] = {default = { "pandas", "numpy", "tensorflow", "matplotlib" },description = "Modules for which labels and snippets should be cached.",items = {type = "string"},type = "array"},["pylsp.plugins.jedi_completion.eager"] = {default = false,description = "Resolve documentation and detail eagerly.",type = "boolean"},["pylsp.plugins.jedi_completion.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_completion.fuzzy"] = {default = false,description = "Enable fuzzy when requesting autocomplete.",type = "boolean"},["pylsp.plugins.jedi_completion.include_class_objects"] = {default = true,description = "Adds class objects as a separate completion item.",type = "boolean"},["pylsp.plugins.jedi_completion.include_params"] = {default = true,description = "Auto-completes methods and classes with tabstops for each parameter.",type = "boolean"},["pylsp.plugins.jedi_completion.resolve_at_most"] = {default = 25,description = "How many labels and snippets (at most) should be resolved?",type = "number"},["pylsp.plugins.jedi_definition.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_definition.follow_builtin_imports"] = {default = true,description = "If follow_imports is True will decide if it follow builtin imports.",type = "boolean"},["pylsp.plugins.jedi_definition.follow_imports"] = {default = true,description = "The goto call will follow imports.",type = "boolean"},["pylsp.plugins.jedi_hover.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_references.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_signature_help.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_symbols.all_scopes"] = {default = true,description = "If True lists the names of all scopes instead of only the module namespace.",type = "boolean"},["pylsp.plugins.jedi_symbols.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.jedi_symbols.include_import_symbols"] = {default = true,description = "If True includes symbols imported from other libraries.",type = "boolean"},["pylsp.plugins.mccabe.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.mccabe.threshold"] = {default = 15,description = "The minimum threshold that triggers warnings about cyclomatic complexity.",type = "number"},["pylsp.plugins.preload.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.preload.modules"] = {default = vim.NIL,description = "List of modules to import on startup",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pycodestyle.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.pycodestyle.exclude"] = {default = vim.NIL,description = "Exclude files or directories which match these patterns.",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pycodestyle.filename"] = {default = vim.NIL,description = "When parsing directories, only check filenames matching these patterns.",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pycodestyle.hangClosing"] = {default = vim.NIL,description = "Hang closing bracket instead of matching indentation of opening bracket's line.",type = "boolean"},["pylsp.plugins.pycodestyle.ignore"] = {default = vim.NIL,description = "Ignore errors and warnings",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pycodestyle.indentSize"] = {default = vim.NIL,description = "Set indentation spaces.",type = "integer"},["pylsp.plugins.pycodestyle.maxLineLength"] = {default = vim.NIL,description = "Set maximum allowed line length.",type = "number"},["pylsp.plugins.pycodestyle.select"] = {default = vim.NIL,description = "Select errors and warnings",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pydocstyle.addIgnore"] = {default = vim.NIL,description = "Ignore errors and warnings in addition to the specified convention.",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pydocstyle.addSelect"] = {default = vim.NIL,description = "Select errors and warnings in addition to the specified convention.",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pydocstyle.convention"] = {default = vim.NIL,description = "Choose the basic list of checked errors by specifying an existing convention.",enum = { "pep257", "numpy" },type = "string"},["pylsp.plugins.pydocstyle.enabled"] = {default = false,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.pydocstyle.ignore"] = {default = vim.NIL,description = "Ignore errors and warnings",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pydocstyle.match"] = {default = "(?!test_).*\\.py",description = "Check only files that exactly match the given regular expression; default is to match files that don't start with 'test_' but end with '.py'.",type = "string"},["pylsp.plugins.pydocstyle.matchDir"] = {default = "[^\\.].*",description = "Search only dirs that exactly match the given regular expression; default is to match dirs which do not begin with a dot.",type = "string"},["pylsp.plugins.pydocstyle.select"] = {default = vim.NIL,description = "Select errors and warnings",items = {type = "string"},type = "array",uniqueItems = true},["pylsp.plugins.pyflakes.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.pylint.args"] = {default = vim.NIL,description = "Arguments to pass to pylint.",items = {type = "string"},type = "array",uniqueItems = false},["pylsp.plugins.pylint.enabled"] = {default = false,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.pylint.executable"] = {default = vim.NIL,description = "Executable to run pylint with. Enabling this will run pylint on unsaved files via stdin. Can slow down workflow. Only works with python3.",type = "string"},["pylsp.plugins.rope_completion.eager"] = {default = false,description = "Resolve documentation and detail eagerly.",type = "boolean"},["pylsp.plugins.rope_completion.enabled"] = {default = false,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.plugins.yapf.enabled"] = {default = true,description = "Enable or disable the plugin.",type = "boolean"},["pylsp.rope.extensionModules"] = {default = vim.NIL,description = "Builtin and c-extension modules that are allowed to be imported and inspected by rope.",type = "string"},["pylsp.rope.ropeFolder"] = {default = vim.NIL,description = "The name of the folder in which rope stores project configurations and data. Pass `null` for not using such a folder at all.",items = {type = "string"},type = "array",uniqueItems = true}},title = "Python Language Server Configuration",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/rust_analyzer.lua b/lua/nvim-lsp-installer/_generated/schemas/rust_analyzer.lua
deleted file mode 100644
index f2501003..00000000
--- a/lua/nvim-lsp-installer/_generated/schemas/rust_analyzer.lua
+++ /dev/null
@@ -1,3 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {properties = {["$generated-end"] = vim.empty_dict(),["$generated-start"] = vim.empty_dict(),["rust-analyzer.assist.expressionFillDefault"] = {default = "todo",enum = { "todo", "default" },enumDescriptions = { "Fill missing expressions with the `todo` macro", "Fill missing expressions with reasonable defaults, `new` or `default` constructors." },markdownDescription = "Placeholder expression to use for missing expressions in assists.",type = "string"},["rust-analyzer.cachePriming.enable"] = {default = true,markdownDescription = "Warm up caches on project load.",type = "boolean"},["rust-analyzer.cachePriming.numThreads"] = {default = 0,markdownDescription = "How many worker threads to handle priming caches. The default `0` means to pick automatically.",maximum = 255,minimum = 0,type = "number"},["rust-analyzer.cargo.autoreload"] = {default = true,markdownDescription = "Automatically refresh project info via `cargo metadata` on\n`Cargo.toml` or `.cargo/config.toml` changes.",type = "boolean"},["rust-analyzer.cargo.buildScripts.enable"] = {default = true,markdownDescription = "Run build scripts (`build.rs`) for more precise code analysis.",type = "boolean"},["rust-analyzer.cargo.buildScripts.overrideCommand"] = {default = vim.NIL,items = {type = "string"},markdownDescription = "Override the command rust-analyzer uses to run build scripts and\nbuild procedural macros. The command is required to output json\nand should therefor include `--message-format=json` or a similar\noption.\n\nBy default, a cargo invocation will be constructed for the configured\ntargets and features, with the following base command line:\n\n```bash\ncargo check --quiet --workspace --message-format=json --all-targets\n```\n.",type = { "null", "array" }},["rust-analyzer.cargo.buildScripts.useRustcWrapper"] = {default = true,markdownDescription = "Use `RUSTC_WRAPPER=rust-analyzer` when running build scripts to\navoid compiling unnecessary things.",type = "boolean"},["rust-analyzer.cargo.features"] = {anyOf = { {enum = { "all" },enumDescriptions = { "Pass `--all-features` to cargo" },type = "string"}, {items = {type = "string"},type = "array"} },default = {},markdownDescription = 'List of features to activate.\n\nSet this to `"all"` to pass `--all-features` to cargo.'},["rust-analyzer.cargo.noDefaultFeatures"] = {default = false,markdownDescription = "Whether to pass `--no-default-features` to cargo.",type = "boolean"},["rust-analyzer.cargo.noSysroot"] = {default = false,markdownDescription = "Internal config for debugging, disables loading of sysroot crates.",type = "boolean"},["rust-analyzer.cargo.target"] = {default = vim.NIL,markdownDescription = "Compilation target override (target triple).",type = { "null", "string" }},["rust-analyzer.cargo.unsetTest"] = {default = { "core" },items = {type = "string"},markdownDescription = "Unsets `#[cfg(test)]` for the specified crates.",type = "array"},["rust-analyzer.cargoRunner"] = {default = vim.NIL,description = "Custom cargo runner extension ID.",type = { "null", "string" }},["rust-analyzer.checkOnSave.allTargets"] = {default = true,markdownDescription = "Check all targets and tests (`--all-targets`).",type = "boolean"},["rust-analyzer.checkOnSave.command"] = {default = "check",markdownDescription = "Cargo command to use for `cargo check`.",type = "string"},["rust-analyzer.checkOnSave.enable"] = {default = true,markdownDescription = "Run specified `cargo check` command for diagnostics on save.",type = "boolean"},["rust-analyzer.checkOnSave.extraArgs"] = {default = {},items = {type = "string"},markdownDescription = "Extra arguments for `cargo check`.",type = "array"},["rust-analyzer.checkOnSave.features"] = {anyOf = { {enum = { "all" },enumDescriptions = { "Pass `--all-features` to cargo" },type = "string"}, {items = {type = "string"},type = "array"}, {type = "null"} },default = vim.NIL,markdownDescription = 'List of features to activate. Defaults to\n`#rust-analyzer.cargo.features#`.\n\nSet to `"all"` to pass `--all-features` to cargo.'},["rust-analyzer.checkOnSave.noDefaultFeatures"] = {default = vim.NIL,markdownDescription = "Whether to pass `--no-default-features` to cargo. Defaults to\n`#rust-analyzer.cargo.noDefaultFeatures#`.",type = { "null", "boolean" }},["rust-analyzer.checkOnSave.overrideCommand"] = {default = vim.NIL,items = {type = "string"},markdownDescription = "Override the command rust-analyzer uses to run build scripts and\nbuild procedural macros. The command is required to output json\nand should therefor include `--message-format=json` or a similar\noption.\n\nAn example command would be:\n\n```bash\ncargo check --workspace --message-format=json --all-targets\n```\n.",type = { "null", "array" }},["rust-analyzer.checkOnSave.target"] = {default = vim.NIL,markdownDescription = "Check for a specific target. Defaults to\n`#rust-analyzer.cargo.target#`.",type = { "null", "string" }},["rust-analyzer.completion.autoimport.enable"] = {default = true,markdownDescription = "Toggles the additional completions that automatically add imports when completed.\nNote that your client must specify the `additionalTextEdits` LSP client capability to truly have this feature enabled.",type = "boolean"},["rust-analyzer.completion.autoself.enable"] = {default = true,markdownDescription = "Toggles the additional completions that automatically show method calls and field accesses\nwith `self` prefixed to them when inside a method.",type = "boolean"},["rust-analyzer.completion.callable.snippets"] = {default = "fill_arguments",enum = { "fill_arguments", "add_parentheses", "none" },enumDescriptions = { "Add call parentheses and pre-fill arguments.", "Add call parentheses.", "Do no snippet completions for callables." },markdownDescription = "Whether to add parenthesis and argument snippets when completing function.",type = "string"},["rust-analyzer.completion.postfix.enable"] = {default = true,markdownDescription = "Whether to show postfix snippets like `dbg`, `if`, `not`, etc.",type = "boolean"},["rust-analyzer.completion.privateEditable.enable"] = {default = false,markdownDescription = "Enables completions of private items and fields that are defined in the current workspace even if they are not visible at the current position.",type = "boolean"},["rust-analyzer.completion.snippets.custom"] = {default = {["Arc::new"] = {body = "Arc::new(${receiver})",description = "Put the expression into an `Arc`",postfix = "arc",requires = "std::sync::Arc",scope = "expr"},["Box::pin"] = {body = "Box::pin(${receiver})",description = "Put the expression into a pinned `Box`",postfix = "pinbox",requires = "std::boxed::Box",scope = "expr"},Err = {body = "Err(${receiver})",description = "Wrap the expression in a `Result::Err`",postfix = "err",scope = "expr"},Ok = {body = "Ok(${receiver})",description = "Wrap the expression in a `Result::Ok`",postfix = "ok",scope = "expr"},["Rc::new"] = {body = "Rc::new(${receiver})",description = "Put the expression into an `Rc`",postfix = "rc",requires = "std::rc::Rc",scope = "expr"},Some = {body = "Some(${receiver})",description = "Wrap the expression in an `Option::Some`",postfix = "some",scope = "expr"}},markdownDescription = "Custom completion snippets.",type = "object"},["rust-analyzer.debug.engine"] = {default = "auto",description = "Preferred debug engine.",enum = { "auto", "vadimcn.vscode-lldb", "ms-vscode.cpptools" },markdownEnumDescriptions = { "First try to use [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb), if it's not installed try to use [MS C++ tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools).", "Use [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb)", "Use [MS C++ tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)" },type = "string"},["rust-analyzer.debug.engineSettings"] = {default = vim.empty_dict(),markdownDescription = 'Optional settings passed to the debug engine. Example: `{ "lldb": { "terminal":"external"} }`',type = "object"},["rust-analyzer.debug.openDebugPane"] = {default = false,markdownDescription = "Whether to open up the `Debug Panel` on debugging start.",type = "boolean"},["rust-analyzer.debug.sourceFileMap"] = {const = "auto",default = {["/rustc/<id>"] = "${env:USERPROFILE}/.rustup/toolchains/<toolchain-id>/lib/rustlib/src/rust"},description = "Optional source file mappings passed to the debug engine.",type = { "object", "string" }},["rust-analyzer.diagnostics.disabled"] = {default = {},items = {type = "string"},markdownDescription = "List of rust-analyzer diagnostics to disable.",type = "array",uniqueItems = true},["rust-analyzer.diagnostics.enable"] = {default = true,markdownDescription = "Whether to show native rust-analyzer diagnostics.",type = "boolean"},["rust-analyzer.diagnostics.experimental.enable"] = {default = false,markdownDescription = "Whether to show experimental rust-analyzer diagnostics that might\nhave more false positives than usual.",type = "boolean"},["rust-analyzer.diagnostics.remapPrefix"] = {default = vim.empty_dict(),markdownDescription = "Map of prefixes to be substituted when parsing diagnostic file paths.\nThis should be the reverse mapping of what is passed to `rustc` as `--remap-path-prefix`.",type = "object"},["rust-analyzer.diagnostics.warningsAsHint"] = {default = {},items = {type = "string"},markdownDescription = "List of warnings that should be displayed with hint severity.\n\nThe warnings will be indicated by faded text or three dots in code\nand will not show up in the `Problems Panel`.",type = "array"},["rust-analyzer.diagnostics.warningsAsInfo"] = {default = {},items = {type = "string"},markdownDescription = "List of warnings that should be displayed with info severity.\n\nThe warnings will be indicated by a blue squiggly underline in code\nand a blue icon in the `Problems Panel`.",type = "array"},["rust-analyzer.files.excludeDirs"] = {default = {},items = {type = "string"},markdownDescription = "These directories will be ignored by rust-analyzer. They are\nrelative to the workspace root, and globs are not supported. You may\nalso need to add the folders to Code's `files.watcherExclude`.",type = "array"},["rust-analyzer.files.watcher"] = {default = "client",markdownDescription = "Controls file watching implementation.",type = "string"},["rust-analyzer.highlightRelated.breakPoints.enable"] = {default = true,markdownDescription = "Enables highlighting of related references while the cursor is on `break`, `loop`, `while`, or `for` keywords.",type = "boolean"},["rust-analyzer.highlightRelated.exitPoints.enable"] = {default = true,markdownDescription = "Enables highlighting of all exit points while the cursor is on any `return`, `?`, `fn`, or return type arrow (`->`).",type = "boolean"},["rust-analyzer.highlightRelated.references.enable"] = {default = true,markdownDescription = "Enables highlighting of related references while the cursor is on any identifier.",type = "boolean"},["rust-analyzer.highlightRelated.yieldPoints.enable"] = {default = true,markdownDescription = "Enables highlighting of all break points for a loop or block context while the cursor is on any `async` or `await` keywords.",type = "boolean"},["rust-analyzer.hover.actions.debug.enable"] = {default = true,markdownDescription = "Whether to show `Debug` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.actions.enable"] = {default = true,markdownDescription = "Whether to show HoverActions in Rust files.",type = "boolean"},["rust-analyzer.hover.actions.gotoTypeDef.enable"] = {default = true,markdownDescription = "Whether to show `Go to Type Definition` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.actions.implementations.enable"] = {default = true,markdownDescription = "Whether to show `Implementations` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.actions.references.enable"] = {default = false,markdownDescription = "Whether to show `References` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.actions.run.enable"] = {default = true,markdownDescription = "Whether to show `Run` action. Only applies when\n`#rust-analyzer.hover.actions.enable#` is set.",type = "boolean"},["rust-analyzer.hover.documentation.enable"] = {default = true,markdownDescription = "Whether to show documentation on hover.",type = "boolean"},["rust-analyzer.hover.links.enable"] = {default = true,markdownDescription = "Use markdown syntax for links in hover.",type = "boolean"},["rust-analyzer.imports.granularity.enforce"] = {default = false,markdownDescription = "Whether to enforce the import granularity setting for all files. If set to false rust-analyzer will try to keep import styles consistent per file.",type = "boolean"},["rust-analyzer.imports.granularity.group"] = {default = "crate",enum = { "preserve", "crate", "module", "item" },enumDescriptions = { "Do not change the granularity of any imports and preserve the original structure written by the developer.", "Merge imports from the same crate into a single use statement. Conversely, imports from different crates are split into separate statements.", "Merge imports from the same module into a single use statement. Conversely, imports from different modules are split into separate statements.", "Flatten imports so that each has its own use statement." },markdownDescription = "How imports should be grouped into use statements.",type = "string"},["rust-analyzer.imports.group.enable"] = {default = true,markdownDescription = "Group inserted imports by the [following order](https://rust-analyzer.github.io/manual.html#auto-import). Groups are separated by newlines.",type = "boolean"},["rust-analyzer.imports.merge.glob"] = {default = true,markdownDescription = "Whether to allow import insertion to merge new imports into single path glob imports like `use std::fmt::*;`.",type = "boolean"},["rust-analyzer.imports.prefix"] = {default = "plain",enum = { "plain", "self", "crate" },enumDescriptions = { "Insert import paths relative to the current module, using up to one `super` prefix if the parent module contains the requested item.", "Insert import paths relative to the current module, using up to one `super` prefix if the parent module contains the requested item. Prefixes `self` in front of the path if it starts with a module.", "Force import paths to be absolute by always starting them with `crate` or the extern crate name they come from." },markdownDescription = "The path structure for newly inserted paths to use.",type = "string"},["rust-analyzer.inlayHints.bindingModeHints.enable"] = {default = false,markdownDescription = "Whether to show inlay type hints for binding modes.",type = "boolean"},["rust-analyzer.inlayHints.chainingHints.enable"] = {default = true,markdownDescription = "Whether to show inlay type hints for method chains.",type = "boolean"},["rust-analyzer.inlayHints.closingBraceHints.enable"] = {default = true,markdownDescription = "Whether to show inlay hints after a closing `}` to indicate what item it belongs to.",type = "boolean"},["rust-analyzer.inlayHints.closingBraceHints.minLines"] = {default = 25,markdownDescription = "Minimum number of lines required before the `}` until the hint is shown (set to 0 or 1\nto always show them).",minimum = 0,type = "integer"},["rust-analyzer.inlayHints.closureReturnTypeHints.enable"] = {default = "never",enum = { "always", "never", "with_block" },enumDescriptions = { "Always show type hints for return types of closures.", "Never show type hints for return types of closures.", "Only show type hints for return types of closures with blocks." },markdownDescription = "Whether to show inlay type hints for return types of closures.",type = "string"},["rust-analyzer.inlayHints.lifetimeElisionHints.enable"] = {default = "never",enum = { "always", "never", "skip_trivial" },enumDescriptions = { "Always show lifetime elision hints.", "Never show lifetime elision hints.", "Only show lifetime elision hints if a return type is involved." },markdownDescription = "Whether to show inlay type hints for elided lifetimes in function signatures.",type = "string"},["rust-analyzer.inlayHints.lifetimeElisionHints.useParameterNames"] = {default = false,markdownDescription = "Whether to prefer using parameter names as the name for elided lifetime hints if possible.",type = "boolean"},["rust-analyzer.inlayHints.maxLength"] = {default = 25,markdownDescription = "Maximum length for inlay hints. Set to null to have an unlimited length.",minimum = 0,type = { "null", "integer" }},["rust-analyzer.inlayHints.parameterHints.enable"] = {default = true,markdownDescription = "Whether to show function parameter name inlay hints at the call\nsite.",type = "boolean"},["rust-analyzer.inlayHints.reborrowHints.enable"] = {default = "never",enum = { "always", "never", "mutable" },enumDescriptions = { "Always show reborrow hints.", "Never show reborrow hints.", "Only show mutable reborrow hints." },markdownDescription = "Whether to show inlay type hints for compiler inserted reborrows.",type = "string"},["rust-analyzer.inlayHints.renderColons"] = {default = true,markdownDescription = "Whether to render leading colons for type hints, and trailing colons for parameter hints.",type = "boolean"},["rust-analyzer.inlayHints.typeHints.enable"] = {default = true,markdownDescription = "Whether to show inlay type hints for variables.",type = "boolean"},["rust-analyzer.inlayHints.typeHints.hideClosureInitialization"] = {default = false,markdownDescription = "Whether to hide inlay type hints for `let` statements that initialize to a closure.\nOnly applies to closures with blocks, same as `#rust-analyzer.inlayHints.closureReturnTypeHints.enable#`.",type = "boolean"},["rust-analyzer.inlayHints.typeHints.hideNamedConstructor"] = {default = false,markdownDescription = "Whether to hide inlay type hints for constructors.",type = "boolean"},["rust-analyzer.joinLines.joinAssignments"] = {default = true,markdownDescription = "Join lines merges consecutive declaration and initialization of an assignment.",type = "boolean"},["rust-analyzer.joinLines.joinElseIf"] = {default = true,markdownDescription = "Join lines inserts else between consecutive ifs.",type = "boolean"},["rust-analyzer.joinLines.removeTrailingComma"] = {default = true,markdownDescription = "Join lines removes trailing commas.",type = "boolean"},["rust-analyzer.joinLines.unwrapTrivialBlock"] = {default = true,markdownDescription = "Join lines unwraps trivial blocks.",type = "boolean"},["rust-analyzer.lens.debug.enable"] = {default = true,markdownDescription = "Whether to show `Debug` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.enable"] = {default = true,markdownDescription = "Whether to show CodeLens in Rust files.",type = "boolean"},["rust-analyzer.lens.forceCustomCommands"] = {default = true,markdownDescription = "Internal config: use custom client-side commands even when the\nclient doesn't set the corresponding capability.",type = "boolean"},["rust-analyzer.lens.implementations.enable"] = {default = true,markdownDescription = "Whether to show `Implementations` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.references.adt.enable"] = {default = false,markdownDescription = "Whether to show `References` lens for Struct, Enum, and Union.\nOnly applies when `#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.references.enumVariant.enable"] = {default = false,markdownDescription = "Whether to show `References` lens for Enum Variants.\nOnly applies when `#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.references.method.enable"] = {default = false,markdownDescription = "Whether to show `Method References` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.references.trait.enable"] = {default = false,markdownDescription = "Whether to show `References` lens for Trait.\nOnly applies when `#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.lens.run.enable"] = {default = true,markdownDescription = "Whether to show `Run` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",type = "boolean"},["rust-analyzer.linkedProjects"] = {default = {},items = {type = { "string", "object" }},markdownDescription = "Disable project auto-discovery in favor of explicitly specified set\nof projects.\n\nElements must be paths pointing to `Cargo.toml`,\n`rust-project.json`, or JSON objects in `rust-project.json` format.",type = "array"},["rust-analyzer.lru.capacity"] = {default = vim.NIL,markdownDescription = "Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.",minimum = 0,type = { "null", "integer" }},["rust-analyzer.notifications.cargoTomlNotFound"] = {default = true,markdownDescription = "Whether to show `can't find Cargo.toml` error message.",type = "boolean"},["rust-analyzer.procMacro.attributes.enable"] = {default = true,markdownDescription = "Expand attribute macros. Requires `#rust-analyzer.procMacro.enable#` to be set.",type = "boolean"},["rust-analyzer.procMacro.enable"] = {default = true,markdownDescription = "Enable support for procedural macros, implies `#rust-analyzer.cargo.buildScripts.enable#`.",type = "boolean"},["rust-analyzer.procMacro.ignored"] = {default = vim.empty_dict(),markdownDescription = "These proc-macros will be ignored when trying to expand them.\n\nThis config takes a map of crate names with the exported proc-macro names to ignore as values.",type = "object"},["rust-analyzer.procMacro.server"] = {default = vim.NIL,markdownDescription = "Internal config, path to proc-macro server executable (typically,\nthis is rust-analyzer itself, but we override this in tests).",type = { "null", "string" }},["rust-analyzer.runnableEnv"] = {anyOf = { {type = "null"}, {items = {properties = {env = {description = 'Variables in form of { "key": "value"}',type = "object"},mask = {description = "Runnable name mask",type = "string"}},type = "object"},type = "array"}, {description = 'Variables in form of { "key": "value"}',type = "object"} },default = vim.NIL,markdownDescription = "Environment variables passed to the runnable launched using `Test` or `Debug` lens or `rust-analyzer.run` command."},["rust-analyzer.runnables.command"] = {default = vim.NIL,markdownDescription = "Command to be executed instead of 'cargo' for runnables.",type = { "null", "string" }},["rust-analyzer.runnables.extraArgs"] = {default = {},items = {type = "string"},markdownDescription = "Additional arguments to be passed to cargo for runnables such as\ntests or binaries. For example, it may be `--release`.",type = "array"},["rust-analyzer.rustc.source"] = {default = vim.NIL,markdownDescription = 'Path to the Cargo.toml of the rust compiler workspace, for usage in rustc_private\nprojects, or "discover" to try to automatically find it if the `rustc-dev` component\nis installed.\n\nAny project which uses rust-analyzer with the rustcPrivate\ncrates must set `[package.metadata.rust-analyzer] rustc_private=true` to use it.\n\nThis option does not take effect until rust-analyzer is restarted.',type = { "null", "string" }},["rust-analyzer.rustfmt.extraArgs"] = {default = {},items = {type = "string"},markdownDescription = "Additional arguments to `rustfmt`.",type = "array"},["rust-analyzer.rustfmt.overrideCommand"] = {default = vim.NIL,items = {type = "string"},markdownDescription = "Advanced option, fully override the command rust-analyzer uses for\nformatting.",type = { "null", "array" }},["rust-analyzer.rustfmt.rangeFormatting.enable"] = {default = false,markdownDescription = "Enables the use of rustfmt's unstable range formatting command for the\n`textDocument/rangeFormatting` request. The rustfmt option is unstable and only\navailable on a nightly build.",type = "boolean"},["rust-analyzer.semanticHighlighting.strings.enable"] = {default = true,markdownDescription = "Use semantic tokens for strings.\n\nIn some editors (e.g. vscode) semantic tokens override other highlighting grammars.\nBy disabling semantic tokens for strings, other grammars can be used to highlight\ntheir contents.",type = "boolean"},["rust-analyzer.server.extraEnv"] = {additionalProperties = {type = { "string", "number" }},default = vim.NIL,markdownDescription = "Extra environment variables that will be passed to the rust-analyzer executable. Useful for passing e.g. `RA_LOG` for debugging.",type = { "null", "object" }},["rust-analyzer.server.path"] = {default = vim.NIL,markdownDescription = "Path to rust-analyzer executable (points to bundled binary by default).",scope = "machine-overridable",type = { "null", "string" }},["rust-analyzer.signatureInfo.detail"] = {default = "full",enum = { "full", "parameters" },enumDescriptions = { "Show the entire signature.", "Show only the parameters." },markdownDescription = "Show full signature of the callable. Only shows parameters if disabled.",type = "string"},["rust-analyzer.signatureInfo.documentation.enable"] = {default = true,markdownDescription = "Show documentation.",type = "boolean"},["rust-analyzer.trace.extension"] = {default = false,description = "Enable logging of VS Code extensions itself.",type = "boolean"},["rust-analyzer.trace.server"] = {default = "off",description = "Trace requests to the rust-analyzer (this is usually overly verbose and not recommended for regular users).",enum = { "off", "messages", "verbose" },enumDescriptions = { "No traces", "Error only", "Full log" },scope = "window",type = "string"},["rust-analyzer.typing.autoClosingAngleBrackets.enable"] = {default = false,markdownDescription = "Whether to insert closing angle brackets when typing an opening angle bracket of a generic argument list.",type = "boolean"},["rust-analyzer.workspace.symbol.search.kind"] = {default = "only_types",enum = { "only_types", "all_symbols" },enumDescriptions = { "Search for types only.", "Search for all symbols kinds." },markdownDescription = "Workspace symbol search kind.",type = "string"},["rust-analyzer.workspace.symbol.search.limit"] = {default = 128,markdownDescription = "Limits the number of items returned from a workspace symbol search (Defaults to 128).\nSome clients like vs-code issue new searches on result filtering and don't require all results to be returned in the initial search.\nOther clients requires all results upfront and might require a higher limit.",minimum = 0,type = "integer"},["rust-analyzer.workspace.symbol.search.scope"] = {default = "workspace",enum = { "workspace", "workspace_and_dependencies" },enumDescriptions = { "Search in current workspace only.", "Search in current workspace and dependencies." },markdownDescription = "Workspace symbol search scope.",type = "string"}},title = "Rust Analyzer",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/sumneko_lua.lua b/lua/nvim-lsp-installer/_generated/schemas/sumneko_lua.lua
deleted file mode 100644
index 7ee05dba..00000000
--- a/lua/nvim-lsp-installer/_generated/schemas/sumneko_lua.lua
+++ /dev/null
@@ -1,3 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {properties = {["Lua.IntelliSense.traceBeSetted"] = {default = false,markdownDescription = "%config.IntelliSense.traceBeSetted%",scope = "resource",type = "boolean"},["Lua.IntelliSense.traceFieldInject"] = {default = false,markdownDescription = "%config.IntelliSense.traceFieldInject%",scope = "resource",type = "boolean"},["Lua.IntelliSense.traceLocalSet"] = {default = false,markdownDescription = "%config.IntelliSense.traceLocalSet%",scope = "resource",type = "boolean"},["Lua.IntelliSense.traceReturn"] = {default = false,markdownDescription = "%config.IntelliSense.traceReturn%",scope = "resource",type = "boolean"},["Lua.completion.autoRequire"] = {default = true,markdownDescription = "%config.completion.autoRequire%",scope = "resource",type = "boolean"},["Lua.completion.callSnippet"] = {default = "Disable",enum = { "Disable", "Both", "Replace" },markdownDescription = "%config.completion.callSnippet%",markdownEnumDescriptions = { "%config.completion.callSnippet.Disable%", "%config.completion.callSnippet.Both%", "%config.completion.callSnippet.Replace%" },scope = "resource",type = "string"},["Lua.completion.displayContext"] = {default = 0,markdownDescription = "%config.completion.displayContext%",scope = "resource",type = "integer"},["Lua.completion.enable"] = {default = true,markdownDescription = "%config.completion.enable%",scope = "resource",type = "boolean"},["Lua.completion.keywordSnippet"] = {default = "Replace",enum = { "Disable", "Both", "Replace" },markdownDescription = "%config.completion.keywordSnippet%",markdownEnumDescriptions = { "%config.completion.keywordSnippet.Disable%", "%config.completion.keywordSnippet.Both%", "%config.completion.keywordSnippet.Replace%" },scope = "resource",type = "string"},["Lua.completion.postfix"] = {default = "@",markdownDescription = "%config.completion.postfix%",scope = "resource",type = "string"},["Lua.completion.requireSeparator"] = {default = ".",markdownDescription = "%config.completion.requireSeparator%",scope = "resource",type = "string"},["Lua.completion.showParams"] = {default = true,markdownDescription = "%config.completion.showParams%",scope = "resource",type = "boolean"},["Lua.completion.showWord"] = {default = "Fallback",enum = { "Enable", "Fallback", "Disable" },markdownDescription = "%config.completion.showWord%",markdownEnumDescriptions = { "%config.completion.showWord.Enable%", "%config.completion.showWord.Fallback%", "%config.completion.showWord.Disable%" },scope = "resource",type = "string"},["Lua.completion.workspaceWord"] = {default = true,markdownDescription = "%config.completion.workspaceWord%",scope = "resource",type = "boolean"},["Lua.diagnostics.disable"] = {items = {type = "string"},markdownDescription = "%config.diagnostics.disable%",scope = "resource",type = "array"},["Lua.diagnostics.disableScheme"] = {default = { "git" },items = {type = "string"},markdownDescription = "%config.diagnostics.disableScheme%",scope = "resource",type = "array"},["Lua.diagnostics.enable"] = {default = true,markdownDescription = "%config.diagnostics.enable%",scope = "resource",type = "boolean"},["Lua.diagnostics.globals"] = {items = {type = "string"},markdownDescription = "%config.diagnostics.globals%",scope = "resource",type = "array"},["Lua.diagnostics.ignoredFiles"] = {default = "Opened",enum = { "Enable", "Opened", "Disable" },markdownDescription = "%config.diagnostics.ignoredFiles%",markdownEnumDescriptions = { "%config.diagnostics.files.Enable%", "%config.diagnostics.files.Opened%", "%config.diagnostics.files.Disable%" },scope = "resource",type = "string"},["Lua.diagnostics.libraryFiles"] = {default = "Opened",enum = { "Enable", "Opened", "Disable" },markdownDescription = "%config.diagnostics.libraryFiles%",markdownEnumDescriptions = { "%config.diagnostics.files.Enable%", "%config.diagnostics.files.Opened%", "%config.diagnostics.files.Disable%" },scope = "resource",type = "string"},["Lua.diagnostics.neededFileStatus"] = {additionalProperties = false,markdownDescription = "%config.diagnostics.neededFileStatus%",properties = {["ambiguity-1"] = {default = "Any",description = "%config.diagnostics.ambiguity-1%",enum = { "Any", "Opened", "None" },type = "string"},["await-in-sync"] = {default = "None",description = "%config.diagnostics.await-in-sync%",enum = { "Any", "Opened", "None" },type = "string"},["circle-doc-class"] = {default = "Any",description = "%config.diagnostics.circle-doc-class%",enum = { "Any", "Opened", "None" },type = "string"},["close-non-object"] = {default = "Any",description = "%config.diagnostics.close-non-object%",enum = { "Any", "Opened", "None" },type = "string"},["code-after-break"] = {default = "Opened",description = "%config.diagnostics.code-after-break%",enum = { "Any", "Opened", "None" },type = "string"},["codestyle-check"] = {default = "None",description = "%config.diagnostics.codestyle-check%",enum = { "Any", "Opened", "None" },type = "string"},["count-down-loop"] = {default = "Any",description = "%config.diagnostics.count-down-loop%",enum = { "Any", "Opened", "None" },type = "string"},deprecated = {default = "Opened",description = "%config.diagnostics.deprecated%",enum = { "Any", "Opened", "None" },type = "string"},["different-requires"] = {default = "Any",description = "%config.diagnostics.different-requires%",enum = { "Any", "Opened", "None" },type = "string"},["discard-returns"] = {default = "Opened",description = "%config.diagnostics.discard-returns%",enum = { "Any", "Opened", "None" },type = "string"},["doc-field-no-class"] = {default = "Any",description = "%config.diagnostics.doc-field-no-class%",enum = { "Any", "Opened", "None" },type = "string"},["duplicate-doc-alias"] = {default = "Any",description = "%config.diagnostics.duplicate-doc-alias%",enum = { "Any", "Opened", "None" },type = "string"},["duplicate-doc-field"] = {default = "Any",description = "%config.diagnostics.duplicate-doc-field%",enum = { "Any", "Opened", "None" },type = "string"},["duplicate-doc-param"] = {default = "Any",description = "%config.diagnostics.duplicate-doc-param%",enum = { "Any", "Opened", "None" },type = "string"},["duplicate-index"] = {default = "Any",description = "%config.diagnostics.duplicate-index%",enum = { "Any", "Opened", "None" },type = "string"},["duplicate-set-field"] = {default = "Any",description = "%config.diagnostics.duplicate-set-field%",enum = { "Any", "Opened", "None" },type = "string"},["empty-block"] = {default = "Opened",description = "%config.diagnostics.empty-block%",enum = { "Any", "Opened", "None" },type = "string"},["global-in-nil-env"] = {default = "Any",description = "%config.diagnostics.global-in-nil-env%",enum = { "Any", "Opened", "None" },type = "string"},["lowercase-global"] = {default = "Any",description = "%config.diagnostics.lowercase-global%",enum = { "Any", "Opened", "None" },type = "string"},["missing-parameter"] = {default = "Opened",description = "%config.diagnostics.missing-parameter%",enum = { "Any", "Opened", "None" },type = "string"},["need-check-nil"] = {default = "Opened",description = "%config.diagnostics.need-check-nil%",enum = { "Any", "Opened", "None" },type = "string"},["newfield-call"] = {default = "Any",description = "%config.diagnostics.newfield-call%",enum = { "Any", "Opened", "None" },type = "string"},["newline-call"] = {default = "Any",description = "%config.diagnostics.newline-call%",enum = { "Any", "Opened", "None" },type = "string"},["no-unknown"] = {default = "None",description = "%config.diagnostics.no-unknown%",enum = { "Any", "Opened", "None" },type = "string"},["not-yieldable"] = {default = "None",description = "%config.diagnostics.not-yieldable%",enum = { "Any", "Opened", "None" },type = "string"},["redefined-local"] = {default = "Opened",description = "%config.diagnostics.redefined-local%",enum = { "Any", "Opened", "None" },type = "string"},["redundant-parameter"] = {default = "Opened",description = "%config.diagnostics.redundant-parameter%",enum = { "Any", "Opened", "None" },type = "string"},["redundant-return"] = {default = "Opened",description = "%config.diagnostics.redundant-return%",enum = { "Any", "Opened", "None" },type = "string"},["redundant-value"] = {default = "Opened",description = "%config.diagnostics.redundant-value%",enum = { "Any", "Opened", "None" },type = "string"},["trailing-space"] = {default = "Opened",description = "%config.diagnostics.trailing-space%",enum = { "Any", "Opened", "None" },type = "string"},["type-check"] = {default = "None",description = "%config.diagnostics.type-check%",enum = { "Any", "Opened", "None" },type = "string"},["unbalanced-assignments"] = {default = "Any",description = "%config.diagnostics.unbalanced-assignments%",enum = { "Any", "Opened", "None" },type = "string"},["undefined-doc-class"] = {default = "Any",description = "%config.diagnostics.undefined-doc-class%",enum = { "Any", "Opened", "None" },type = "string"},["undefined-doc-name"] = {default = "Any",description = "%config.diagnostics.undefined-doc-name%",enum = { "Any", "Opened", "None" },type = "string"},["undefined-doc-param"] = {default = "Any",description = "%config.diagnostics.undefined-doc-param%",enum = { "Any", "Opened", "None" },type = "string"},["undefined-env-child"] = {default = "Any",description = "%config.diagnostics.undefined-env-child%",enum = { "Any", "Opened", "None" },type = "string"},["undefined-field"] = {default = "Opened",description = "%config.diagnostics.undefined-field%",enum = { "Any", "Opened", "None" },type = "string"},["undefined-global"] = {default = "Any",description = "%config.diagnostics.undefined-global%",enum = { "Any", "Opened", "None" },type = "string"},["unknown-diag-code"] = {default = "Any",description = "%config.diagnostics.unknown-diag-code%",enum = { "Any", "Opened", "None" },type = "string"},["unused-function"] = {default = "Opened",description = "%config.diagnostics.unused-function%",enum = { "Any", "Opened", "None" },type = "string"},["unused-label"] = {default = "Opened",description = "%config.diagnostics.unused-label%",enum = { "Any", "Opened", "None" },type = "string"},["unused-local"] = {default = "Opened",description = "%config.diagnostics.unused-local%",enum = { "Any", "Opened", "None" },type = "string"},["unused-vararg"] = {default = "Opened",description = "%config.diagnostics.unused-vararg%",enum = { "Any", "Opened", "None" },type = "string"}},scope = "resource",title = "neededFileStatus",type = "object"},["Lua.diagnostics.severity"] = {additionalProperties = false,markdownDescription = "%config.diagnostics.severity%",properties = {["ambiguity-1"] = {default = "Warning",description = "%config.diagnostics.ambiguity-1%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["await-in-sync"] = {default = "Warning",description = "%config.diagnostics.await-in-sync%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["circle-doc-class"] = {default = "Warning",description = "%config.diagnostics.circle-doc-class%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["close-non-object"] = {default = "Warning",description = "%config.diagnostics.close-non-object%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["code-after-break"] = {default = "Hint",description = "%config.diagnostics.code-after-break%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["codestyle-check"] = {default = "Warning",description = "%config.diagnostics.codestyle-check%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["count-down-loop"] = {default = "Warning",description = "%config.diagnostics.count-down-loop%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},deprecated = {default = "Warning",description = "%config.diagnostics.deprecated%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["different-requires"] = {default = "Warning",description = "%config.diagnostics.different-requires%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["discard-returns"] = {default = "Warning",description = "%config.diagnostics.discard-returns%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["doc-field-no-class"] = {default = "Warning",description = "%config.diagnostics.doc-field-no-class%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["duplicate-doc-alias"] = {default = "Warning",description = "%config.diagnostics.duplicate-doc-alias%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["duplicate-doc-field"] = {default = "Warning",description = "%config.diagnostics.duplicate-doc-field%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["duplicate-doc-param"] = {default = "Warning",description = "%config.diagnostics.duplicate-doc-param%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["duplicate-index"] = {default = "Warning",description = "%config.diagnostics.duplicate-index%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["duplicate-set-field"] = {default = "Warning",description = "%config.diagnostics.duplicate-set-field%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["empty-block"] = {default = "Hint",description = "%config.diagnostics.empty-block%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["global-in-nil-env"] = {default = "Warning",description = "%config.diagnostics.global-in-nil-env%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["lowercase-global"] = {default = "Information",description = "%config.diagnostics.lowercase-global%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["missing-parameter"] = {default = "Warning",description = "%config.diagnostics.missing-parameter%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["need-check-nil"] = {default = "Warning",description = "%config.diagnostics.need-check-nil%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["newfield-call"] = {default = "Warning",description = "%config.diagnostics.newfield-call%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["newline-call"] = {default = "Information",description = "%config.diagnostics.newline-call%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["no-unknown"] = {default = "Information",description = "%config.diagnostics.no-unknown%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["not-yieldable"] = {default = "Warning",description = "%config.diagnostics.not-yieldable%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["redefined-local"] = {default = "Hint",description = "%config.diagnostics.redefined-local%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["redundant-parameter"] = {default = "Warning",description = "%config.diagnostics.redundant-parameter%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["redundant-return"] = {default = "Warning",description = "%config.diagnostics.redundant-return%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["redundant-value"] = {default = "Warning",description = "%config.diagnostics.redundant-value%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["trailing-space"] = {default = "Hint",description = "%config.diagnostics.trailing-space%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["type-check"] = {default = "Warning",description = "%config.diagnostics.type-check%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["unbalanced-assignments"] = {default = "Warning",description = "%config.diagnostics.unbalanced-assignments%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["undefined-doc-class"] = {default = "Warning",description = "%config.diagnostics.undefined-doc-class%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["undefined-doc-name"] = {default = "Warning",description = "%config.diagnostics.undefined-doc-name%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["undefined-doc-param"] = {default = "Warning",description = "%config.diagnostics.undefined-doc-param%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["undefined-env-child"] = {default = "Information",description = "%config.diagnostics.undefined-env-child%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["undefined-field"] = {default = "Warning",description = "%config.diagnostics.undefined-field%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["undefined-global"] = {default = "Warning",description = "%config.diagnostics.undefined-global%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["unknown-diag-code"] = {default = "Warning",description = "%config.diagnostics.unknown-diag-code%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["unused-function"] = {default = "Hint",description = "%config.diagnostics.unused-function%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["unused-label"] = {default = "Hint",description = "%config.diagnostics.unused-label%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["unused-local"] = {default = "Hint",description = "%config.diagnostics.unused-local%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"},["unused-vararg"] = {default = "Hint",description = "%config.diagnostics.unused-vararg%",enum = { "Error", "Warning", "Information", "Hint" },type = "string"}},scope = "resource",title = "severity",type = "object"},["Lua.diagnostics.workspaceDelay"] = {default = 3000,markdownDescription = "%config.diagnostics.workspaceDelay%",scope = "resource",type = "integer"},["Lua.diagnostics.workspaceRate"] = {default = 100,markdownDescription = "%config.diagnostics.workspaceRate%",scope = "resource",type = "integer"},["Lua.format.defaultConfig"] = {markdownDescription = "%config.format.defaultConfig%",scope = "resource",type = "object"},["Lua.format.enable"] = {default = true,markdownDescription = "%config.format.enable%",scope = "resource",type = "boolean"},["Lua.hint.arrayIndex"] = {default = "Auto",enum = { "Enable", "Auto", "Disable" },markdownDescription = "%config.hint.arrayIndex%",markdownEnumDescriptions = { "%config.hint.arrayIndex.Enable%", "%config.hint.arrayIndex.Auto%", "%config.hint.arrayIndex.Disable%" },scope = "resource",type = "string"},["Lua.hint.enable"] = {default = false,markdownDescription = "%config.hint.enable%",scope = "resource",type = "boolean"},["Lua.hint.paramName"] = {default = "All",enum = { "All", "Literal", "Disable" },markdownDescription = "%config.hint.paramName%",markdownEnumDescriptions = { "%config.hint.paramName.All%", "%config.hint.paramName.Literal%", "%config.hint.paramName.Disable%" },scope = "resource",type = "string"},["Lua.hint.paramType"] = {default = true,markdownDescription = "%config.hint.paramType%",scope = "resource",type = "boolean"},["Lua.hint.setType"] = {default = false,markdownDescription = "%config.hint.setType%",scope = "resource",type = "boolean"},["Lua.hover.enable"] = {default = true,markdownDescription = "%config.hover.enable%",scope = "resource",type = "boolean"},["Lua.hover.enumsLimit"] = {default = 5,markdownDescription = "%config.hover.enumsLimit%",scope = "resource",type = "integer"},["Lua.hover.previewFields"] = {default = 20,markdownDescription = "%config.hover.previewFields%",scope = "resource",type = "integer"},["Lua.hover.viewNumber"] = {default = true,markdownDescription = "%config.hover.viewNumber%",scope = "resource",type = "boolean"},["Lua.hover.viewString"] = {default = true,markdownDescription = "%config.hover.viewString%",scope = "resource",type = "boolean"},["Lua.hover.viewStringMax"] = {default = 1000,markdownDescription = "%config.hover.viewStringMax%",scope = "resource",type = "integer"},["Lua.misc.parameters"] = {items = {type = "string"},markdownDescription = "%config.misc.parameters%",scope = "resource",type = "array"},["Lua.runtime.builtin"] = {additionalProperties = false,markdownDescription = "%config.runtime.builtin%",properties = {basic = {default = "default",description = "%config.runtime.builtin.basic%",enum = { "default", "enable", "disable" },type = "string"},bit = {default = "default",description = "%config.runtime.builtin.bit%",enum = { "default", "enable", "disable" },type = "string"},bit32 = {default = "default",description = "%config.runtime.builtin.bit32%",enum = { "default", "enable", "disable" },type = "string"},builtin = {default = "default",description = "%config.runtime.builtin.builtin%",enum = { "default", "enable", "disable" },type = "string"},coroutine = {default = "default",description = "%config.runtime.builtin.coroutine%",enum = { "default", "enable", "disable" },type = "string"},debug = {default = "default",description = "%config.runtime.builtin.debug%",enum = { "default", "enable", "disable" },type = "string"},ffi = {default = "default",description = "%config.runtime.builtin.ffi%",enum = { "default", "enable", "disable" },type = "string"},io = {default = "default",description = "%config.runtime.builtin.io%",enum = { "default", "enable", "disable" },type = "string"},jit = {default = "default",description = "%config.runtime.builtin.jit%",enum = { "default", "enable", "disable" },type = "string"},math = {default = "default",description = "%config.runtime.builtin.math%",enum = { "default", "enable", "disable" },type = "string"},os = {default = "default",description = "%config.runtime.builtin.os%",enum = { "default", "enable", "disable" },type = "string"},package = {default = "default",description = "%config.runtime.builtin.package%",enum = { "default", "enable", "disable" },type = "string"},string = {default = "default",description = "%config.runtime.builtin.string%",enum = { "default", "enable", "disable" },type = "string"},table = {default = "default",description = "%config.runtime.builtin.table%",enum = { "default", "enable", "disable" },type = "string"},utf8 = {default = "default",description = "%config.runtime.builtin.utf8%",enum = { "default", "enable", "disable" },type = "string"}},scope = "resource",type = "object"},["Lua.runtime.fileEncoding"] = {default = "utf8",enum = { "utf8", "ansi", "utf16le", "utf16be" },markdownDescription = "%config.runtime.fileEncoding%",scope = "resource",type = "string"},["Lua.runtime.nonstandardSymbol"] = {items = {enum = { "//", "/**/", "`", "+=", "-=", "*=", "/=", "||", "&&", "!", "!=", "continue" },type = "string"},markdownDescription = "%config.runtime.nonstandardSymbol%",scope = "resource",type = "array"},["Lua.runtime.path"] = {default = { "?.lua", "?/init.lua" },items = {type = "string"},markdownDescription = "%config.runtime.path%",scope = "resource",type = "array"},["Lua.runtime.pathStrict"] = {default = false,markdownDescription = "%config.runtime.pathStrict%",scope = "resource",type = "boolean"},["Lua.runtime.plugin"] = {default = "",markdownDescription = "%config.runtime.plugin%",scope = "resource",type = "string"},["Lua.runtime.special"] = {additionalProperties = false,markdownDescription = "%config.runtime.special%",patternProperties = {[".*"] = {default = "require",enum = { "_G", "rawset", "rawget", "setmetatable", "require", "dofile", "loadfile", "pcall", "xpcall", "assert" },type = "string"}},scope = "resource",type = "object"},["Lua.runtime.unicodeName"] = {default = false,markdownDescription = "%config.runtime.unicodeName%",scope = "resource",type = "boolean"},["Lua.runtime.version"] = {default = "Lua 5.4",enum = { "Lua 5.1", "Lua 5.2", "Lua 5.3", "Lua 5.4", "LuaJIT" },markdownDescription = "%config.runtime.version%",scope = "resource",type = "string"},["Lua.semantic.annotation"] = {default = true,markdownDescription = "%config.semantic.annotation%",scope = "resource",type = "boolean"},["Lua.semantic.enable"] = {default = true,markdownDescription = "%config.semantic.enable%",scope = "resource",type = "boolean"},["Lua.semantic.keyword"] = {default = false,markdownDescription = "%config.semantic.keyword%",scope = "resource",type = "boolean"},["Lua.semantic.variable"] = {default = true,markdownDescription = "%config.semantic.variable%",scope = "resource",type = "boolean"},["Lua.signatureHelp.enable"] = {default = true,markdownDescription = "%config.signatureHelp.enable%",scope = "resource",type = "boolean"},["Lua.telemetry.enable"] = {default = vim.NIL,markdownDescription = "%config.telemetry.enable%",scope = "resource",tags = { "telemetry" },type = { "boolean", "null" }},["Lua.window.progressBar"] = {default = true,markdownDescription = "%config.window.progressBar%",scope = "resource",type = "boolean"},["Lua.window.statusBar"] = {default = true,markdownDescription = "%config.window.statusBar%",scope = "resource",type = "boolean"},["Lua.workspace.checkThirdParty"] = {default = true,markdownDescription = "%config.workspace.checkThirdParty%",scope = "resource",type = "boolean"},["Lua.workspace.ignoreDir"] = {default = { ".vscode" },items = {type = "string"},markdownDescription = "%config.workspace.ignoreDir%",scope = "resource",type = "array"},["Lua.workspace.ignoreSubmodules"] = {default = true,markdownDescription = "%config.workspace.ignoreSubmodules%",scope = "resource",type = "boolean"},["Lua.workspace.library"] = {items = {type = "string"},markdownDescription = "%config.workspace.library%",scope = "resource",type = "array"},["Lua.workspace.maxPreload"] = {default = 5000,markdownDescription = "%config.workspace.maxPreload%",scope = "resource",type = "integer"},["Lua.workspace.preloadFileSize"] = {default = 500,markdownDescription = "%config.workspace.preloadFileSize%",scope = "resource",type = "integer"},["Lua.workspace.supportScheme"] = {default = { "file", "untitled", "git" },items = {type = "string"},markdownDescription = "%config.workspace.supportScheme%",scope = "resource",type = "array"},["Lua.workspace.useGitIgnore"] = {default = true,markdownDescription = "%config.workspace.useGitIgnore%",scope = "resource",type = "boolean"},["Lua.workspace.userThirdParty"] = {items = {type = "string"},markdownDescription = "%config.workspace.userThirdParty%",scope = "resource",type = "array"}},title = "Lua",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/_generated/schemas/svelte.lua b/lua/nvim-lsp-installer/_generated/schemas/svelte.lua
deleted file mode 100644
index 2571f81e..00000000
--- a/lua/nvim-lsp-installer/_generated/schemas/svelte.lua
+++ /dev/null
@@ -1,3 +0,0 @@
--- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.
--- stylua: ignore start
-return {properties = {["svelte.ask-to-enable-ts-plugin"] = {default = true,description = "Ask on startup to enable the TypeScript plugin.",title = "Ask to enable TypeScript Svelte plugin",type = "boolean"},["svelte.enable-ts-plugin"] = {default = false,description = "Enables a TypeScript plugin which provides intellisense for Svelte files inside TS/JS files.",title = "Enable TypeScript Svelte plugin",type = "boolean"},["svelte.language-server.ls-path"] = {description = "- You normally don't set this - Path to the language server executable. If you installed the \"svelte-language-server\" npm package, it's within there at \"bin/server.js\". Path can be either relative to your workspace root or absolute. Set this only if you want to use a custom version of the language server. This will then also use the workspace version of TypeScript. This setting can only be changed in user settings for security reasons.",scope = "application",title = "Language Server Path",type = "string"},["svelte.language-server.port"] = {default = -1,description = "- You normally don't set this - At which port to spawn the language server. Can be used for attaching to the process for debugging / profiling. If you experience crashes due to \"port already in use\", try setting the port. -1 = default port is used.",title = "Language Server Port",type = "number"},["svelte.language-server.runtime"] = {description = "- You normally don't need this - Path to the node executable to use to spawn the language server. This is useful when you depend on native modules such as node-sass as without this they will run in the context of vscode, meaning node version mismatch is likely. Minimum required node version is 12.17. This setting can only be changed in user settings for security reasons.",scope = "application",title = "Language Server Runtime",type = "string"},["svelte.plugin.css.colorPresentations.enable"] = {default = true,description = "Enable color picker for CSS",title = "CSS: Color Picker",type = "boolean"},["svelte.plugin.css.completions.emmet"] = {default = true,description = "Enable emmet auto completions for CSS",title = "CSS: Include Emmet Completions",type = "boolean"},["svelte.plugin.css.completions.enable"] = {default = true,description = "Enable auto completions for CSS",title = "CSS: Auto Complete",type = "boolean"},["svelte.plugin.css.diagnostics.enable"] = {default = true,description = "Enable diagnostic messages for CSS",title = "CSS: Diagnostics",type = "boolean"},["svelte.plugin.css.documentColors.enable"] = {default = true,description = "Enable document colors for CSS",title = "CSS: Document Colors",type = "boolean"},["svelte.plugin.css.documentSymbols.enable"] = {default = true,description = "Enable document symbols for CSS",title = "CSS: Symbols in Outline",type = "boolean"},["svelte.plugin.css.enable"] = {default = true,description = "Enable the CSS plugin",title = "CSS",type = "boolean"},["svelte.plugin.css.globals"] = {default = "",description = "Which css files should be checked for global variables (`--global-var: value;`). These variables are added to the css completions. String of comma-separated file paths or globs relative to workspace root.",title = "CSS: Global Files",type = "string"},["svelte.plugin.css.hover.enable"] = {default = true,description = "Enable hover info for CSS",title = "CSS: Hover Info",type = "boolean"},["svelte.plugin.css.selectionRange.enable"] = {default = true,description = "Enable selection range for CSS",title = "CSS: SelectionRange",type = "boolean"},["svelte.plugin.html.completions.emmet"] = {default = true,description = "Enable emmet auto completions for HTML",title = "HTML: Include Emmet Completions",type = "boolean"},["svelte.plugin.html.completions.enable"] = {default = true,description = "Enable auto completions for HTML",title = "HTML: Auto Complete",type = "boolean"},["svelte.plugin.html.documentSymbols.enable"] = {default = true,description = "Enable document symbols for HTML",title = "HTML: Symbols in Outline",type = "boolean"},["svelte.plugin.html.enable"] = {default = true,description = "Enable the HTML plugin",title = "HTML",type = "boolean"},["svelte.plugin.html.hover.enable"] = {default = true,description = "Enable hover info for HTML",title = "HTML: Hover Info",type = "boolean"},["svelte.plugin.html.linkedEditing.enable"] = {default = true,description = "Enable Linked Editing for HTML",title = "HTML: Linked Editing",type = "boolean"},["svelte.plugin.html.renameTags.enable"] = {default = true,description = "Enable rename for the opening/closing tag pairs in HTML",title = "HTML: Rename tags",type = "boolean"},["svelte.plugin.html.tagComplete.enable"] = {default = true,description = "Enable HTML tag auto closing",title = "HTML: Tag Auto Closing",type = "boolean"},["svelte.plugin.svelte.codeActions.enable"] = {default = true,description = "Enable Code Actions for Svelte",title = "Svelte: Code Actions",type = "boolean"},["svelte.plugin.svelte.compilerWarnings"] = {additionalProperties = {enum = { "ignore", "error" },type = "string"},default = vim.empty_dict(),description = "Svelte compiler warning codes to ignore or to treat as errors. Example: { 'css-unused-selector': 'ignore', 'unused-export-let': 'error'}",title = "Svelte: Compiler Warnings Settings",type = "object"},["svelte.plugin.svelte.completions.enable"] = {default = true,description = "Enable auto completions for Svelte",title = "Svelte: Completions",type = "boolean"},["svelte.plugin.svelte.defaultScriptLanguage"] = {default = "none",description = "The default language to use when generating new script tags",enum = { "none", "ts" },title = "Svelte: Default Script Language",type = "string"},["svelte.plugin.svelte.diagnostics.enable"] = {default = true,description = "Enable diagnostic messages for Svelte",title = "Svelte: Diagnostics",type = "boolean"},["svelte.plugin.svelte.enable"] = {default = true,description = "Enable the Svelte plugin",title = "Svelte",type = "boolean"},["svelte.plugin.svelte.format.config.printWidth"] = {default = 80,description = "Maximum line width after which code is tried to be broken up. This is a Prettier core option. If you have the Prettier extension installed, this option is ignored and the corresponding option of that extension is used instead. This option is also ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Print Width",type = "number"},["svelte.plugin.svelte.format.config.singleQuote"] = {default = false,description = "Use single quotes instead of double quotes, where possible. This is a Prettier core option. If you have the Prettier extension installed, this option is ignored and the corresponding option of that extension is used instead. This option is also ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Quotes",type = "boolean"},["svelte.plugin.svelte.format.config.svelteAllowShorthand"] = {default = true,description = "Option to enable/disable component attribute shorthand if attribute name and expression are the same. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Allow Shorthand",type = "boolean"},["svelte.plugin.svelte.format.config.svelteBracketNewLine"] = {default = true,description = "Put the `>` of a multiline element on a new line. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Bracket New Line",type = "boolean"},["svelte.plugin.svelte.format.config.svelteIndentScriptAndStyle"] = {default = true,description = "Whether or not to indent code inside `<script>` and `<style>` tags. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Indent Script And Style",type = "boolean"},["svelte.plugin.svelte.format.config.svelteSortOrder"] = {default = "options-scripts-markup-styles",description = "Format: join the keys `options`, `scripts`, `markup`, `styles` with a - in the order you want. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Sort Order",type = "string"},["svelte.plugin.svelte.format.config.svelteStrictMode"] = {default = false,description = "More strict HTML syntax. This option is ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte Format: Strict Mode",type = "boolean"},["svelte.plugin.svelte.format.enable"] = {default = true,description = "Enable formatting for Svelte (includes css & js). You can set some formatting options through this extension. They will be ignored if there's any kind of configuration file, for example a `.prettierrc` file.",title = "Svelte: Format",type = "boolean"},["svelte.plugin.svelte.hover.enable"] = {default = true,description = "Enable hover information for Svelte",title = "Svelte: Hover",type = "boolean"},["svelte.plugin.svelte.rename.enable"] = {default = true,description = "Enable rename/move Svelte files functionality",title = "Svelte: Rename",type = "boolean"},["svelte.plugin.svelte.selectionRange.enable"] = {default = true,description = "Enable selection range for Svelte",title = "Svelte: Selection Range",type = "boolean"},["svelte.plugin.svelte.useNewTransformation"] = {default = false,description = "Svelte files need to be transformed to something that TypeScript understands for intellisense. Version 2.0 of this transformation can be enabled with this setting. It will be the default, soon.",title = "Use a new transformation for intellisense",type = "boolean"},["svelte.plugin.typescript.codeActions.enable"] = {default = true,description = "Enable code actions for TypeScript",title = "TypeScript: Code Actions",type = "boolean"},["svelte.plugin.typescript.completions.enable"] = {default = true,description = "Enable completions for TypeScript",title = "TypeScript: Completions",type = "boolean"},["svelte.plugin.typescript.definitions.enable"] = {default = true,description = "Enable go to definition for TypeScript",title = "TypeScript: Go to Definition",type = "boolean"},["svelte.plugin.typescript.diagnostics.enable"] = {default = true,description = "Enable diagnostic messages for TypeScript",title = "TypeScript: Diagnostics",type = "boolean"},["svelte.plugin.typescript.documentSymbols.enable"] = {default = true,description = "Enable document symbols for TypeScript",title = "TypeScript: Symbols in Outline",type = "boolean"},["svelte.plugin.typescript.enable"] = {default = true,description = "Enable the TypeScript plugin",title = "TypeScript",type = "boolean"},["svelte.plugin.typescript.findReferences.enable"] = {default = true,description = "Enable find-references for TypeScript",title = "TypeScript: Find References",type = "boolean"},["svelte.plugin.typescript.hover.enable"] = {default = true,description = "Enable hover info for TypeScript",title = "TypeScript: Hover Info",type = "boolean"},["svelte.plugin.typescript.implementation.enable"] = {default = true,description = "Enable go to implementation for Typescript",title = "Typescript: Go to Implementation",type = "boolean"},["svelte.plugin.typescript.rename.enable"] = {default = true,description = "Enable rename functionality for JS/TS variables inside Svelte files",title = "TypeScript: Rename",type = "boolean"},["svelte.plugin.typescript.selectionRange.enable"] = {default = true,description = "Enable selection range for TypeScript",title = "TypeScript: Selection Range",type = "boolean"},["svelte.plugin.typescript.semanticTokens.enable"] = {default = true,description = "Enable semantic tokens (semantic highlight) for TypeScript.",title = "TypeScript: Semantic Tokens",type = "boolean"},["svelte.plugin.typescript.signatureHelp.enable"] = {default = true,description = "Enable signature help (parameter hints) for TypeScript",title = "TypeScript: Signature Help",type = "boolean"},["svelte.plugin.typescript.typeDefinition.enable"] = {default = true,description = "Enable go to Type Definition for Typescript",title = "Typescript: Go to Type Definition",type = "boolean"},["svelte.trace.server"] = {default = "off",description = "Traces the communication between VS Code and the Svelte Language Server.",enum = { "off", "messages", "verbose" },type = "string"}},title = "Svelte",type = "object"} \ No newline at end of file
diff --git a/lua/nvim-lsp-installer/core/fetch.lua b/lua/nvim-lsp-installer/core/fetch.lua
deleted file mode 100644
index 4a5ff4df..00000000
--- a/lua/nvim-lsp-installer/core/fetch.lua
+++ /dev/null
@@ -1,54 +0,0 @@
-local log = require "nvim-lsp-installer.log"
-local platform = require "nvim-lsp-installer.core.platform"
-local Result = require "nvim-lsp-installer.core.result"
-local spawn = require "nvim-lsp-installer.core.spawn"
-local powershell = require "nvim-lsp-installer.core.managers.powershell"
-
-local USER_AGENT = "nvim-lsp-installer (+https://github.com/williamboman/nvim-lsp-installer)"
-
-local HEADERS = {
- wget = { "--header", ("User-Agent: %s"):format(USER_AGENT) },
- curl = { "-H", ("User-Agent: %s"):format(USER_AGENT) },
- iwr = ("-Headers @{'User-Agent' = '%s'}"):format(USER_AGENT),
-}
-
----@alias FetchOpts {out_file:string}
-
----@async
----@param url string @The url to fetch.
----@param opts FetchOpts
-local function fetch(url, opts)
- opts = opts or {}
- log.fmt_debug("Fetching URL %s", url)
-
- local platform_specific = Result.failure()
-
- if platform.is_win then
- if opts.out_file then
- platform_specific = powershell.command(
- ([[iwr %s -UseBasicParsing -Uri %q -OutFile %q;]]):format(HEADERS.iwr, url, opts.out_file)
- )
- else
- platform_specific = powershell.command(
- ([[Write-Output (iwr %s -UseBasicParsing -Uri %q).Content;]]):format(HEADERS.iwr, url)
- )
- end
- end
-
- return platform_specific
- :recover_catching(function()
- return spawn.wget({ HEADERS.wget, "-nv", "-O", opts.out_file or "-", url }):get_or_throw()
- end)
- :recover_catching(function()
- return spawn.curl({ HEADERS.curl, "-fsSL", opts.out_file and { "-o", opts.out_file } or vim.NIL, url }):get_or_throw()
- end)
- :map(function(result)
- if opts.out_file then
- return result
- else
- return result.stdout
- end
- end)
-end
-
-return fetch
diff --git a/lua/nvim-lsp-installer/core/functional/string.lua b/lua/nvim-lsp-installer/core/functional/string.lua
deleted file mode 100644
index 212fc0d9..00000000
--- a/lua/nvim-lsp-installer/core/functional/string.lua
+++ /dev/null
@@ -1,30 +0,0 @@
-local fun = require "nvim-lsp-installer.core.functional.function"
-
-local _ = {}
-
----@param pattern string
----@param str string
-_.matches = fun.curryN(function(pattern, str)
- return str:match(pattern) ~= nil
-end, 2)
-
----@param template string
----@param str string
-_.format = fun.curryN(function(template, str)
- return template:format(str)
-end, 2)
-
----@param sep string
----@param str string
-_.split = fun.curryN(function(sep, str)
- return vim.split(str, sep)
-end, 2)
-
----@param pattern string
----@param repl string|function|table
----@param str string
-_.gsub = fun.curryN(function(pattern, repl, str)
- return string.gsub(str, pattern, repl)
-end, 3)
-
-return _
diff --git a/lua/nvim-lsp-installer/core/functional/table.lua b/lua/nvim-lsp-installer/core/functional/table.lua
deleted file mode 100644
index 37aee19e..00000000
--- a/lua/nvim-lsp-installer/core/functional/table.lua
+++ /dev/null
@@ -1,9 +0,0 @@
-local fun = require "nvim-lsp-installer.core.functional.function"
-
-local _ = {}
-
-_.prop = fun.curryN(function(index, tbl)
- return tbl[index]
-end, 2)
-
-return _
diff --git a/lua/nvim-lsp-installer/core/installer/context.lua b/lua/nvim-lsp-installer/core/installer/context.lua
deleted file mode 100644
index aaec4ff5..00000000
--- a/lua/nvim-lsp-installer/core/installer/context.lua
+++ /dev/null
@@ -1,199 +0,0 @@
-local spawn = require "nvim-lsp-installer.core.spawn"
-local log = require "nvim-lsp-installer.log"
-local fs = require "nvim-lsp-installer.core.fs"
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local receipt = require "nvim-lsp-installer.core.receipt"
-local installer = require "nvim-lsp-installer.core.installer"
-local a = require "nvim-lsp-installer.core.async"
-
----@class ContextualSpawn
----@field cwd CwdManager
----@field stdio_sink StdioSink
-local ContextualSpawn = {}
-
----@param cwd CwdManager
----@param stdio_sink StdioSink
-function ContextualSpawn.new(cwd, stdio_sink)
- return setmetatable({ cwd = cwd, stdio_sink = stdio_sink }, ContextualSpawn)
-end
-function ContextualSpawn.__index(self, cmd)
- return function(args)
- args.cwd = args.cwd or self.cwd:get()
- args.stdio_sink = args.stdio_sink or self.stdio_sink
- -- We get_or_throw() here for convenience reasons.
- -- Almost every time spawn is called via context we want the command to succeed.
- return spawn[cmd](args):get_or_throw()
- end
-end
-
----@class ContextualFs
----@field private cwd CwdManager
-local ContextualFs = {}
-ContextualFs.__index = ContextualFs
-
----@param cwd CwdManager
-function ContextualFs.new(cwd)
- return setmetatable({ cwd = cwd }, ContextualFs)
-end
-
----@async
----@param rel_path string @The relative path from the current working directory to the file to append.
----@param contents string
-function ContextualFs:append_file(rel_path, contents)
- return fs.async.append_file(path.concat { self.cwd:get(), rel_path }, contents)
-end
-
----@async
----@param rel_path string @The relative path from the current working directory to the file to write.
----@param contents string
-function ContextualFs:write_file(rel_path, contents)
- return fs.async.write_file(path.concat { self.cwd:get(), rel_path }, contents)
-end
-
----@async
----@param rel_path string @The relative path from the current working directory.
-function ContextualFs:file_exists(rel_path)
- return fs.async.file_exists(path.concat { self.cwd:get(), rel_path })
-end
-
----@async
----@param rel_path string @The relative path from the current working directory.
-function ContextualFs:dir_exists(rel_path)
- return fs.async.dir_exists(path.concat { self.cwd:get(), rel_path })
-end
-
----@async
----@param rel_path string @The relative path from the current working directory.
-function ContextualFs:rmrf(rel_path)
- return fs.async.rmrf(path.concat { self.cwd:get(), rel_path })
-end
-
----@async
----@param rel_path string @The relative path from the current working directory.
-function ContextualFs:unlink(rel_path)
- return fs.async.unlink(path.concat { self.cwd:get(), rel_path })
-end
-
----@async
----@param old_path string
----@param new_path string
-function ContextualFs:rename(old_path, new_path)
- return fs.async.rename(path.concat { self.cwd:get(), old_path }, path.concat { self.cwd:get(), new_path })
-end
-
----@async
----@param dirpath string
-function ContextualFs:mkdir(dirpath)
- return fs.async.mkdir(path.concat { self.cwd:get(), dirpath })
-end
-
----@class CwdManager
----@field private boundary_path string @Defines the upper boundary for which paths are allowed as cwd.
----@field private cwd string
-local CwdManager = {}
-CwdManager.__index = CwdManager
-
-function CwdManager.new(boundary_path, cwd)
- assert(type(boundary_path) == "string")
- return setmetatable({
- boundary_path = boundary_path,
- cwd = cwd,
- }, CwdManager)
-end
-
-function CwdManager:get()
- assert(self.cwd ~= nil, "Tried to access cwd before it was set.")
- return self.cwd
-end
-
----@param new_cwd string
-function CwdManager:set(new_cwd)
- assert(type(new_cwd) == "string")
- assert(
- path.is_subdirectory(self.boundary_path, new_cwd),
- ("%q is not a subdirectory of %q"):format(new_cwd, self.boundary_path)
- )
- self.cwd = new_cwd
-end
-
----@class InstallContext
----@field public name string
----@field public receipt InstallReceiptBuilder
----@field public requested_version Optional
----@field public fs ContextualFs
----@field public spawn JobSpawn
----@field public cwd CwdManager
----@field public destination_dir string
----@field public stdio_sink StdioSink
----@field public boundary_path string
-local InstallContext = {}
-InstallContext.__index = InstallContext
-
-function InstallContext.new(opts)
- local cwd_manager = CwdManager.new(opts.boundary_path)
- return setmetatable({
- name = opts.name,
- cwd = cwd_manager,
- spawn = ContextualSpawn.new(cwd_manager, opts.stdio_sink),
- fs = ContextualFs.new(cwd_manager),
- receipt = receipt.InstallReceiptBuilder.new(),
- boundary_path = opts.boundary_path,
- destination_dir = opts.destination_dir,
- requested_version = opts.requested_version,
- stdio_sink = opts.stdio_sink,
- }, InstallContext)
-end
-
----@async
-function InstallContext:promote_cwd()
- local cwd = self.cwd:get()
- if self.destination_dir == cwd then
- log.fmt_debug("cwd %s is already promoted (at %s)", cwd, self.destination_dir)
- return
- end
- log.fmt_debug("Promoting cwd %s to %s", cwd, self.destination_dir)
- -- 1. Remove destination dir, if it exists
- if fs.async.dir_exists(self.destination_dir) then
- fs.async.rmrf(self.destination_dir)
- end
- -- 2. Prepare for renaming cwd to destination
- if platform.is_unix then
- -- Some Unix systems will raise an error when renaming a directory to a destination that does not already exist.
- fs.async.mkdir(self.destination_dir)
- end
- -- 3. Move the cwd to the final installation directory
- fs.async.rename(cwd, self.destination_dir)
- -- 4. Update cwd
- self.cwd:set(self.destination_dir)
-end
-
----Runs the provided async functions concurrently and returns their result, once all are resolved.
----This is really just a wrapper around a.wait_all() that makes sure to patch the coroutine context before creating the
----new async execution contexts.
----@async
----@param suspend_fns async fun(ctx: InstallContext)[]
-function InstallContext:run_concurrently(suspend_fns)
- return a.wait_all(vim.tbl_map(function(suspend_fn)
- return function()
- return installer.run_installer(self, suspend_fn)
- end
- end, suspend_fns))
-end
-
----@param rel_path string @The relative path from the current working directory to change cwd to. Will only restore to the initial cwd after execution of fn (if provided).
----@param fn async fun() @(optional) The function to run in the context of the given path.
-function InstallContext:chdir(rel_path, fn)
- local old_cwd = self.cwd:get()
- self.cwd:set(path.concat { old_cwd, rel_path })
- if fn then
- local ok, result = pcall(fn)
- self.cwd:set(old_cwd)
- if not ok then
- error(result, 0)
- end
- return result
- end
-end
-
-return InstallContext
diff --git a/lua/nvim-lsp-installer/core/installer/init.lua b/lua/nvim-lsp-installer/core/installer/init.lua
deleted file mode 100644
index 3bb9590d..00000000
--- a/lua/nvim-lsp-installer/core/installer/init.lua
+++ /dev/null
@@ -1,87 +0,0 @@
-local log = require "nvim-lsp-installer.log"
-local path = require "nvim-lsp-installer.core.path"
-local fs = require "nvim-lsp-installer.core.fs"
-local Result = require "nvim-lsp-installer.core.result"
-
-local M = {}
-
----@async
----@param context InstallContext
-local function write_receipt(context)
- if context.receipt.is_marked_invalid then
- return log.fmt_debug("Skipping writing receipt for %s because it is marked as invalid.", context.name)
- end
- context.receipt:with_name(context.name):with_schema_version("1.0a"):with_completion_time(vim.loop.gettimeofday())
- local receipt_success, install_receipt = pcall(context.receipt.build, context.receipt)
- if receipt_success then
- local receipt_path = path.concat { context.cwd:get(), "nvim-lsp-installer-receipt.json" }
- pcall(fs.async.write_file, receipt_path, vim.json.encode(install_receipt))
- else
- log.fmt_error("Failed to build receipt for installation=%s, error=%s", context.name, install_receipt)
- end
-end
-
-local CONTEXT_REQUEST = {}
-
----@return InstallContext
-function M.context()
- return coroutine.yield(CONTEXT_REQUEST)
-end
-
----@async
----@param context InstallContext
----@param installer async fun(context: InstallContext)
-function M.run_installer(context, installer)
- local thread = coroutine.create(installer)
- local step
- local ret_val
- step = function(...)
- local ok, result = coroutine.resume(thread, ...)
- if not ok then
- error(result, 0)
- elseif result == CONTEXT_REQUEST then
- step(context)
- elseif coroutine.status(thread) == "suspended" then
- -- yield to parent coroutine
- step(coroutine.yield(result))
- else
- ret_val = result
- end
- end
- step(context)
- return ret_val
-end
-
----@async
----@param context InstallContext
----@param installer async fun(ctx: InstallContext)
-function M.execute(context, installer)
- log.fmt_debug("Executing installer for name=%s", context.name)
- local tmp_installation_dir = ("%s.tmp"):format(context.destination_dir)
- return Result.run_catching(function()
- -- 1. prepare installation dir
- context.receipt:with_start_time(vim.loop.gettimeofday())
- if fs.async.dir_exists(tmp_installation_dir) then
- fs.async.rmrf(tmp_installation_dir)
- end
- fs.async.mkdirp(tmp_installation_dir)
- context.cwd:set(tmp_installation_dir)
-
- -- 2. run installer
- M.run_installer(context, installer)
-
- -- 3. finalize
- log.fmt_debug("Finalizing installer for name=%s", context.name)
- write_receipt(context)
- context:promote_cwd()
- pcall(fs.async.rmrf, tmp_installation_dir)
- end):on_failure(function(failure)
- log.fmt_error("Installation failed, name=%s, error=%s", context.name, tostring(failure))
- context.stdio_sink.stderr(tostring(failure))
- context.stdio_sink.stderr "\n"
- pcall(fs.async.rmrf, tmp_installation_dir)
- pcall(fs.async.rmrf, context.cwd:get())
- end)
-end
-
-return M
diff --git a/lua/nvim-lsp-installer/dispatcher.lua b/lua/nvim-lsp-installer/dispatcher.lua
deleted file mode 100644
index c58efec7..00000000
--- a/lua/nvim-lsp-installer/dispatcher.lua
+++ /dev/null
@@ -1,23 +0,0 @@
-local M = {}
-
-local registered_callbacks = {}
-
----@param server Server
-M.dispatch_server_ready = function(server)
- for _, callback in pairs(registered_callbacks) do
- local ok, err = pcall(callback, server)
- if not ok then
- vim.notify(tostring(err), vim.log.levels.ERROR)
- end
- end
-end
-
----@param callback fun(server: Server)
-function M.register_server_ready_callback(callback)
- registered_callbacks[callback] = callback
- return function()
- registered_callbacks[callback] = nil
- end
-end
-
-return M
diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua
deleted file mode 100644
index 065fabfb..00000000
--- a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua
+++ /dev/null
@@ -1,94 +0,0 @@
-local a = require "nvim-lsp-installer.core.async"
-local JobExecutionPool = require "nvim-lsp-installer.jobs.pool"
-local VersionCheckResult = require "nvim-lsp-installer.jobs.outdated-servers.version-check-result"
-local log = require "nvim-lsp-installer.log"
-
-local npm = require "nvim-lsp-installer.core.managers.npm"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-local git = require "nvim-lsp-installer.core.managers.git"
-local gem = require "nvim-lsp-installer.core.managers.gem"
-local go = require "nvim-lsp-installer.core.managers.go"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-local github = require "nvim-lsp-installer.core.managers.github"
-local composer = require "nvim-lsp-installer.core.managers.composer"
-local jdtls_check = require "nvim-lsp-installer.jobs.outdated-servers.jdtls"
-local luarocks = require "nvim-lsp-installer.core.managers.luarocks"
-
-local M = {}
-
-local jobpool = JobExecutionPool:new {
- size = 4,
-}
-
----@type table<InstallReceiptSourceType, async fun(receipt: InstallReceipt, install_dir: string): Result>
-local checkers = {
- ["npm"] = npm.check_outdated_primary_package,
- ["pip3"] = pip3.check_outdated_primary_package,
- ["git"] = git.check_outdated_git_clone,
- ["cargo"] = cargo.check_outdated_primary_package,
- ["composer"] = composer.check_outdated_primary_package,
- ["gem"] = gem.check_outdated_primary_package,
- ["go"] = go.check_outdated_primary_package,
- ["luarocks"] = luarocks.check_outdated_primary_package,
- ["jdtls"] = jdtls_check,
- ["github_release_file"] = github.check_outdated_primary_package_release,
- ["github_release"] = github.check_outdated_primary_package_release,
- ["github_tag"] = github.check_outdated_primary_package_tag,
-}
-
-local pending_servers = {}
-
----@alias VersionCheckResultProgress {completed: integer, total: integer}
-
----@param servers Server[]
----@param on_result fun(result: VersionCheckResult, progress: VersionCheckResultProgress)
-function M.identify_outdated_servers(servers, on_result)
- local total_checks = #servers
- local completed_checks = 0
- for _, server in ipairs(servers) do
- if not pending_servers[server.name] then
- pending_servers[server.name] = true
- jobpool:supply(function(_done)
- local function complete(result)
- completed_checks = completed_checks + 1
- pending_servers[server.name] = nil
- on_result(result, { completed = completed_checks, total = total_checks })
- _done()
- end
-
- local receipt = server:get_receipt()
- if receipt then
- if
- vim.tbl_contains({ "github_release_file", "github_tag" }, receipt.primary_source.type)
- and receipt.schema_version == "1.0"
- then
- -- Receipts of this version are in some cases incomplete.
- return complete(VersionCheckResult.fail(server))
- end
-
- local checker = checkers[receipt.primary_source.type]
- if checker then
- a.run(checker, function(success, result)
- if success and result:is_success() then
- complete(VersionCheckResult.success(server, { result:get_or_nil() }))
- else
- complete(VersionCheckResult.fail(server))
- end
- end, receipt, server.root_dir)
- else
- complete(VersionCheckResult.empty(server))
- log.fmt_debug("Unable to find checker for source=%s", receipt.primary_source.type)
- end
- else
- complete(VersionCheckResult.empty(server))
- log.fmt_trace("No receipt found for server=%s", server.name)
- end
- end)
- else
- completed_checks = completed_checks + 1
- on_result(VersionCheckResult.fail(server), { completed = completed_checks, total = total_checks })
- end
- end
-end
-
-return M
diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/jdtls.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/jdtls.lua
deleted file mode 100644
index 0e3d68fc..00000000
--- a/lua/nvim-lsp-installer/jobs/outdated-servers/jdtls.lua
+++ /dev/null
@@ -1,16 +0,0 @@
-local eclipse = require "nvim-lsp-installer.core.clients.eclipse"
-
----@async
----@param receipt InstallReceipt
-return function(receipt)
- return eclipse.fetch_latest_jdtls_version():map_catching(function(latest_version)
- if receipt.primary_source.version ~= latest_version then
- return {
- name = "jdtls",
- current_version = receipt.primary_source.version,
- latest_version = latest_version,
- }
- end
- error "Primary package is not outdated."
- end)
-end
diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/version-check-result.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/version-check-result.lua
deleted file mode 100644
index 4b8d669c..00000000
--- a/lua/nvim-lsp-installer/jobs/outdated-servers/version-check-result.lua
+++ /dev/null
@@ -1,39 +0,0 @@
----@class VersionCheckResult
----@field public server Server
----@field public success boolean
----@field public outdated_packages OutdatedPackage[]
-local VersionCheckResult = {}
-VersionCheckResult.__index = VersionCheckResult
-
----@alias OutdatedPackage {name: string, current_version: string, latest_version: string}
-
----@param server Server
----@param outdated_packages OutdatedPackage[]
-function VersionCheckResult.new(server, success, outdated_packages)
- local self = setmetatable({}, VersionCheckResult)
- self.server = server
- self.success = success
- self.outdated_packages = outdated_packages
- return self
-end
-
----@param server Server
-function VersionCheckResult.fail(server)
- return VersionCheckResult.new(server, false)
-end
-
----@param server Server
----@param outdated_packages OutdatedPackage[]
-function VersionCheckResult.success(server, outdated_packages)
- return VersionCheckResult.new(server, true, outdated_packages)
-end
-
-function VersionCheckResult.empty(server)
- return VersionCheckResult.success(server, {})
-end
-
-function VersionCheckResult:has_outdated_packages()
- return #self.outdated_packages > 0
-end
-
-return VersionCheckResult
diff --git a/lua/nvim-lsp-installer/jobs/pool.lua b/lua/nvim-lsp-installer/jobs/pool.lua
deleted file mode 100644
index 78302643..00000000
--- a/lua/nvim-lsp-installer/jobs/pool.lua
+++ /dev/null
@@ -1,41 +0,0 @@
-local log = require "nvim-lsp-installer.log"
-
-local JobExecutionPool = {}
-JobExecutionPool.__index = JobExecutionPool
-
-function JobExecutionPool:new(opts)
- return setmetatable({
- size = opts.size,
- _queue = {},
- _supplied_jobs = 0,
- _running_jobs = 0,
- }, JobExecutionPool)
-end
-
-function JobExecutionPool:supply(fn)
- self._supplied_jobs = self._supplied_jobs + 1
- self._queue[#self._queue + 1] = setmetatable({
- id = self._supplied_jobs,
- }, {
- __call = function(_, ...)
- fn(...)
- end,
- })
- self:_dequeue()
-end
-
-function JobExecutionPool:_dequeue()
- log.fmt_trace("Dequeuing job running_jobs=%s, size=%s", self._running_jobs, self.size)
- if self._running_jobs < self.size and #self._queue > 0 then
- local dequeued = table.remove(self._queue, 1)
- self._running_jobs = self._running_jobs + 1
- log.fmt_trace("Dequeued job job_id=%s, running_jobs=%s, size=%s", dequeued.id, self._running_jobs, self.size)
- dequeued(function()
- log.fmt_trace("Job finished job_id=%s", dequeued.id)
- self._running_jobs = self._running_jobs - 1
- self:_dequeue()
- end)
- end
-end
-
-return JobExecutionPool
diff --git a/lua/nvim-lsp-installer/jobs/version-check/init.lua b/lua/nvim-lsp-installer/jobs/version-check/init.lua
deleted file mode 100644
index 3062bb78..00000000
--- a/lua/nvim-lsp-installer/jobs/version-check/init.lua
+++ /dev/null
@@ -1,78 +0,0 @@
-local Result = require "nvim-lsp-installer.core.result"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-local gem = require "nvim-lsp-installer.core.managers.gem"
-local go = require "nvim-lsp-installer.core.managers.go"
-local luarocks = require "nvim-lsp-installer.core.managers.luarocks"
-local git = require "nvim-lsp-installer.core.managers.git"
-local composer = require "nvim-lsp-installer.core.managers.composer"
-
-local M = {}
-
-local ServerVersion = {}
-ServerVersion.__index = ServerVersion
-
----@param field_name string
-local function version_in_receipt(field_name)
- ---@param receipt InstallReceipt
- ---@return Result
- return function(_, receipt)
- return Result.success(receipt.primary_source[field_name])
- end
-end
-
-local function noop()
- return Result.failure "Unable to detect version."
-end
-
----@type table<InstallReceiptSourceType, async fun(server: Server, receipt: InstallReceipt): Result>
-local version_checker = {
- ["npm"] = function(server, receipt)
- return npm.get_installed_primary_package_version(receipt, server.root_dir)
- end,
- ["pip3"] = function(server, receipt)
- return pip3.get_installed_primary_package_version(receipt, server.root_dir)
- end,
- ["gem"] = function(server, receipt)
- return gem.get_installed_primary_package_version(receipt, server.root_dir)
- end,
- ["cargo"] = function(server, receipt)
- return cargo.get_installed_primary_package_version(receipt, server.root_dir)
- end,
- ["composer"] = function(server, receipt)
- return composer.get_installed_primary_package_version(receipt, server.root_dir)
- end,
- ["git"] = function(server)
- return git.get_installed_revision(server.root_dir)
- end,
- ["go"] = function(server, receipt)
- return go.get_installed_primary_package_version(receipt, server.root_dir)
- end,
- ["luarocks"] = function(server, receipt)
- return luarocks.get_installed_primary_package_version(receipt, server.root_dir)
- end,
- ["github_release_file"] = version_in_receipt "release",
- ["github_release"] = version_in_receipt "release",
- ["github_tag"] = version_in_receipt "tag",
- ["jdtls"] = version_in_receipt "version",
-}
-
----@async
----@param server Server
----@return Result
-function M.check_server_version(server)
- local receipt = server:get_receipt()
- if not receipt then
- return Result.failure "Unable to retrieve installation receipt."
- end
- local version_check = version_checker[receipt.primary_source.type] or noop
- local ok, result = pcall(version_check, server, receipt)
- if ok then
- return result
- else
- return Result.failure(result)
- end
-end
-
-return M
diff --git a/lua/nvim-lsp-installer/middleware.lua b/lua/nvim-lsp-installer/middleware.lua
deleted file mode 100644
index 04ffe2a9..00000000
--- a/lua/nvim-lsp-installer/middleware.lua
+++ /dev/null
@@ -1,76 +0,0 @@
-local util = require "lspconfig.util"
-local _ = require "nvim-lsp-installer.core.functional"
-local notify = require "nvim-lsp-installer.notify"
-local servers = require "nvim-lsp-installer.servers"
-local settings = require "nvim-lsp-installer.settings"
-local functional = require "nvim-lsp-installer.core.functional"
-
-local memoize, set_of = functional.memoize, functional.set_of
-
-local M = {}
-
----@param t1 table
----@param t2 table
-local function merge_in_place(t1, t2)
- for k, v in pairs(t2) do
- if type(v) == "table" then
- if type(t1[k]) == "table" and not vim.tbl_islist(t1[k]) then
- merge_in_place(t1[k], v)
- else
- t1[k] = v
- end
- else
- t1[k] = v
- end
- end
- return t1
-end
-
-local memoized_set = memoize(set_of)
-
----@param server_name string
-local function should_auto_install(server_name)
- if settings.current.automatic_installation == true then
- return true
- end
- if type(settings.current.automatic_installation) == "table" then
- return not memoized_set(settings.current.automatic_installation.exclude)[server_name]
- end
- return false
-end
-
-local registered_server_hooks = {}
-
----@param server_name string
----@param fn fun(config: table)
-function M.register_server_hook(server_name, fn)
- if not registered_server_hooks[server_name] then
- registered_server_hooks[server_name] = {}
- end
- table.insert(registered_server_hooks[server_name], fn)
-end
-
-function M.register_lspconfig_hook()
- util.on_setup = util.add_hook_before(util.on_setup, function(config)
- local ok, server = servers.get_server(config.name)
- if ok then
- if server:is_installed() then
- merge_in_place(config, server._default_options)
- elseif should_auto_install(server.name) then
- notify("(automatic installation) Installing LSP server: " .. server.name)
- server:install()
- end
- end
-
- if registered_server_hooks[config.name] then
- _.each(function(fn)
- local ok, err = pcall(fn, config)
- if not ok then
- notify(err, vim.log.levels.ERROR)
- end
- end, registered_server_hooks[config.name])
- end
- end)
-end
-
-return M
diff --git a/lua/nvim-lsp-installer/server.lua b/lua/nvim-lsp-installer/server.lua
deleted file mode 100644
index 95f8f354..00000000
--- a/lua/nvim-lsp-installer/server.lua
+++ /dev/null
@@ -1,182 +0,0 @@
-local dispatcher = require "nvim-lsp-installer.dispatcher"
-local a = require "nvim-lsp-installer.core.async"
-local InstallContext = require "nvim-lsp-installer.core.installer.context"
-local fs = require "nvim-lsp-installer.core.fs"
-local log = require "nvim-lsp-installer.log"
-local settings = require "nvim-lsp-installer.settings"
-local installer = require "nvim-lsp-installer.core.installer"
-local servers = require "nvim-lsp-installer.servers"
-local status_win = require "nvim-lsp-installer.ui"
-local path = require "nvim-lsp-installer.core.path"
-local receipt = require "nvim-lsp-installer.core.receipt"
-local Optional = require "nvim-lsp-installer.core.optional"
-
-local M = {}
-
--- old, but also somewhat convenient, API
-M.get_server_root_path = servers.get_server_install_path
-
----@alias ServerDeprecation {message:string, replace_with:string|nil}
----@alias ServerOpts {name:string, root_dir:string, homepage:string|nil, deprecated:ServerDeprecation, installer:async fun(ctx: InstallContext), default_options:table, languages: string[]}
-
----@class Server
----@field public name string @The server name. This is the same as lspconfig's server names.
----@field public root_dir string @The directory where the server should be installed in.
----@field public homepage string|nil @The homepage where users can find more information. This is shown to users in the UI.
----@field public deprecated ServerDeprecation|nil @The existence (not nil) of this field indicates this server is depracted.
----@field public languages string[]
----@field private _installer async fun(ctx: InstallContext)
----@field private _on_ready_handlers fun(server: Server)[]
----@field private _default_options table @The server's default options. This is used in @see Server#setup.
-M.Server = {}
-M.Server.__index = M.Server
-
----@param opts ServerOpts
----@return Server
-function M.Server:new(opts)
- return setmetatable({
- name = opts.name,
- root_dir = opts.root_dir,
- homepage = opts.homepage,
- deprecated = opts.deprecated,
- languages = opts.languages or {},
- _on_ready_handlers = {},
- _installer = opts.installer,
- _default_options = opts.default_options,
- }, M.Server)
-end
-
----Sets up the language server via lspconfig. This function has the same signature as the setup function in nvim-lspconfig.
----@param opts table @The lspconfig server configuration.
-function M.Server:setup_lsp(opts)
- assert(
- not settings.uses_new_setup,
- "Please set up servers directly via lspconfig instead of going through nvim-lsp-installer (this method is now deprecated)! Refer to :h nvim-lsp-installer-quickstart for more information."
- )
- -- We require the lspconfig server here in order to do it as late as possible.
- -- The reason for this is because once a lspconfig server has been imported, it's
- -- automatically registered with lspconfig and causes it to show up in :LspInfo and whatnot.
- local lsp_server = require("lspconfig")[self.name]
- if lsp_server then
- lsp_server.setup(vim.tbl_deep_extend("force", self._default_options, opts or {}))
- else
- error(
- (
- "Unable to setup server %q: Could not find lspconfig server entry. Make sure you are running a recent version of lspconfig."
- ):format(self.name)
- )
- end
-end
-
----Sets up the language server and attaches all open buffers.
----@param opts table @The lspconfig server configuration.
-function M.Server:setup(opts)
- assert(
- not settings.uses_new_setup,
- "Please set up servers directly via lspconfig instead of going through nvim-lsp-installer (this method is now deprecated)! Refer to :h nvim-lsp-installer-quickstart for more information."
- )
- self:setup_lsp(opts)
- if not (opts.autostart == false) then
- self:attach_buffers()
- end
-end
-
----Attaches this server to all current open buffers with a 'filetype' that matches the server's configured filetypes.
-function M.Server:attach_buffers()
- log.trace("Attaching server to buffers", self.name)
- local lsp_server = require("lspconfig")[self.name]
- for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do
- if lsp_server.filetypes then
- log.fmt_trace("Attaching server=%s to bufnr=%s using filetypes wrapper", self.name, bufnr)
- lsp_server.manager.try_add_wrapper(bufnr)
- else
- log.fmt_trace("Attaching server=%s to bufnr=%s", self.name, bufnr)
- lsp_server.manager.try_add(bufnr)
- end
- end
- log.trace("Successfully attached server to buffers", self.name)
-end
-
----Registers a handler (callback) to be executed when the server is ready to be setup.
----@param handler fun(server: Server)
-function M.Server:on_ready(handler)
- table.insert(self._on_ready_handlers, handler)
- if self:is_installed() then
- handler(self)
- end
-end
-
----@return table @A deep copy of this server's default options. Note that these default options are nvim-lsp-installer specific, and does not include any default options provided by lspconfig.
-function M.Server:get_default_options()
- return vim.deepcopy(self._default_options)
-end
-
----@return string[] @The list of supported filetypes.
-function M.Server:get_supported_filetypes()
- local metadata = require "nvim-lsp-installer._generated.metadata"
-
- if metadata[self.name] then
- return metadata[self.name].filetypes
- end
-
- return {}
-end
-
-function M.Server:get_settings_schema()
- local ok, schema = pcall(require, ("nvim-lsp-installer._generated.schemas.%s"):format(self.name))
- return (ok and schema) or nil
-end
-
----@return boolean
-function M.Server:is_installed()
- return servers.is_server_installed(self.name)
-end
-
----Queues the server to be asynchronously installed.
----@param version string|nil @The version of the server to install. If nil, the latest version will be installed.
-function M.Server:install(version)
- status_win().install_server(self, version)
-end
-
-function M.Server:_get_receipt_path()
- return path.concat { self.root_dir, "nvim-lsp-installer-receipt.json" }
-end
-
----@return InstallReceipt|nil
-function M.Server:get_receipt()
- local receipt_path = self:_get_receipt_path()
- if fs.sync.file_exists(receipt_path) then
- local receipt_json = vim.json.decode(fs.sync.read_file(receipt_path))
- return receipt.InstallReceipt.from_json(receipt_json)
- end
- return nil
-end
-
----@param context table
----@param callback fun(success: boolean)
-function M.Server:install_attached(context, callback)
- a.run(function()
- local install_context = InstallContext.new {
- name = self.name,
- boundary_path = settings.current.install_root_dir,
- stdio_sink = context.stdio_sink,
- destination_dir = self.root_dir,
- requested_version = Optional.of_nilable(context.requested_server_version),
- }
- installer.execute(install_context, self._installer):get_or_throw()
- a.scheduler()
- dispatcher.dispatch_server_ready(self)
- for _, on_ready_handler in ipairs(self._on_ready_handlers) do
- on_ready_handler(self)
- end
- end, callback)
-end
-
-function M.Server:uninstall()
- log.debug("Uninstalling server", self.name)
- if fs.sync.dir_exists(self.root_dir) then
- fs.sync.rmrf(self.root_dir)
- end
-end
-
-return M
diff --git a/lua/nvim-lsp-installer/servers/angularls/init.lua b/lua/nvim-lsp-installer/servers/angularls/init.lua
deleted file mode 100644
index c10d0a97..00000000
--- a/lua/nvim-lsp-installer/servers/angularls/init.lua
+++ /dev/null
@@ -1,49 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-local _ = require "nvim-lsp-installer.core.functional"
-local path = require "nvim-lsp-installer.core.path"
-
-local append_node_modules = _.map(function(dir)
- return path.concat { dir, "node_modules" }
-end)
-
-return function(name, root_dir)
- local function get_cmd(workspace_dir)
- local cmd = {
- "ngserver",
- "--stdio",
- "--tsProbeLocations",
- table.concat(append_node_modules { root_dir, workspace_dir }, ","),
- "--ngProbeLocations",
- table.concat(
- append_node_modules {
- path.concat { root_dir, "node_modules", "@angular", "language-server" },
- workspace_dir,
- },
- ","
- ),
- }
- if platform.is_win then
- table.insert(cmd, 1, "cmd.exe")
- table.insert(cmd, 2, "/C")
- end
-
- return cmd
- end
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://angular.io/guide/language-service",
- languages = { "angular" },
- installer = npm.packages { "@angular/language-server", "typescript" },
- default_options = {
- cmd = get_cmd(path.cwd()),
- cmd_env = npm.env(root_dir),
- on_new_config = function(new_config, new_root_dir)
- new_config.cmd = get_cmd(new_root_dir)
- end,
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/ansiblels/init.lua b/lua/nvim-lsp-installer/servers/ansiblels/init.lua
deleted file mode 100644
index d5208204..00000000
--- a/lua/nvim-lsp-installer/servers/ansiblels/init.lua
+++ /dev/null
@@ -1,23 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-local git = require "nvim-lsp-installer.core.managers.git"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "ansible" },
- homepage = "https://github.com/ansible/ansible-language-server",
- installer = function()
- git.clone({ "https://github.com/ansible/ansible-language-server" }).with_receipt()
- -- ansiblels has quite a strict npm version requirement.
- -- Install dependencies using the the latest npm version.
- npm.exec { "npm@latest", "install" }
- npm.run { "compile" }
- end,
- default_options = {
- cmd = { "node", path.concat { root_dir, "out", "server", "src", "server.js" }, "--stdio" },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/apex_ls/init.lua b/lua/nvim-lsp-installer/servers/apex_ls/init.lua
deleted file mode 100644
index 2ed778a9..00000000
--- a/lua/nvim-lsp-installer/servers/apex_ls/init.lua
+++ /dev/null
@@ -1,43 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local github = require "nvim-lsp-installer.core.managers.github"
-local github_client = require "nvim-lsp-installer.core.managers.github.client"
-local Optional = require "nvim-lsp-installer.core.optional"
-local path = require "nvim-lsp-installer.core.path"
-local _ = require "nvim-lsp-installer.core.functional"
-
-return function(name, root_dir)
- local JAR_FILE = "apex-jorje-lsp.jar"
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/forcedotcom/salesforcedx-vscode",
- languages = { "apex" },
- ---@async
- ---@param ctx InstallContext
- installer = function(ctx)
- local repo = "forcedotcom/salesforcedx-vscode"
-
- -- See https://github.com/forcedotcom/salesforcedx-vscode/issues/4184#issuecomment-1146052086
- ---@type GitHubRelease
- local release = github_client
- .fetch_releases(repo)
- :map(_.find_first(_.prop_satisfies(_.compose(_.gt(0), _.length), "assets")))
- :map(Optional.of_nilable)
- :get_or_throw() -- Result unwrap
- :or_else_throw "Failed to find release with assets." -- Optional unwrap
-
- github.unzip_release_file({
- version = Optional.of(release.tag_name),
- asset_file = _.compose(_.format "salesforcedx-vscode-apex-%s.vsix", _.gsub("^v", "")),
- repo = repo,
- }).with_receipt()
-
- ctx.fs:rename(path.concat { "extension", "out", JAR_FILE }, JAR_FILE)
- ctx.fs:rmrf "extension"
- end,
- default_options = {
- apex_jar_path = path.concat { root_dir, JAR_FILE },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/arduino_language_server/README.md b/lua/nvim-lsp-installer/servers/arduino_language_server/README.md
deleted file mode 100644
index e229366b..00000000
--- a/lua/nvim-lsp-installer/servers/arduino_language_server/README.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# arduino_language_server
-
-## Necessary extra configuration
-
-The Arduino Language Server does not come fully bootstrapped out of the box. In order for the language server to
-successfully start, you need to provide which [FQBN](#FQBN) (e.g. "arduino:avr:nano") it should start with.
-
-This is done during server setup, and can be done by providing a custom `cmd`:
-
-```lua
-local MY_FQBN = "arduino:avr:nano"
-lspconfig.arduino_language_server.setup {
- cmd = {
- "arduino-language-server",
- "-cli-config", "/path/to/arduino-cli.yaml",
- "-fqbn",
- MY_FQBN
- }
-}
-```
-
-### Dynamically changing FQBN per project
-
-```lua
--- When the arduino server starts in these directories, use the provided FQBN.
--- Note that the server needs to start exactly in these directories.
--- This example would require some extra modification to support applying the FQBN on subdirectories!
-local my_arduino_fqbn = {
- ["/home/h4ck3r/dev/arduino/blink"] = "arduino:avr:nano",
- ["/home/h4ck3r/dev/arduino/sensor"] = "arduino:mbed:nanorp2040connect",
-}
-
-local DEFAULT_FQBN = "arduino:avr:uno"
-
-lspconfig.arduino_language_server.setup {
- on_new_config = function (config, root_dir)
- local fqbn = my_arduino_fqbn[root_dir]
- if not fqbn then
- vim.notify(("Could not find which FQBN to use in %q. Defaulting to %q."):format(root_dir, DEFAULT_FQBN))
- fqbn = DEFAULT_FQBN
- end
- config.cmd = {
- "arduino-language-server",
- "-cli-config", "/path/to/arduino-cli.yaml",
- "-fqbn",
- fqbn
- }
- end
-}
-```
-
-## FQBN
-
-A FQBN, fully qualified board name, is used to distinguish between the various supported boards. Its format is defined
-as `<package>:<architecture>:<board>`, where
-
-- `<package>` - vendor identifier; typically just `arduino` for Arduino boards
-- `<architecture>` - microcontroller architecture; e.g., `avr`, `megaavr`, `sam`, etc.
-- `<board>` - board name defined by the software; e.g., `uno`, `uno2018`, `yun`, etc.
-
-To identify the available FQBNs for boards you currently have connected, you may use the `arduino-cli` command, like so:
-
-```sh
-$ arduino-cli board list
-Port Protocol Type Board Name FQBN Core
-/dev/ttyACM0 serial Serial Port (USB) Arduino Uno arduino:avr:uno arduino:avr
- ^^^^^^^^^^^^^^^
-```
diff --git a/lua/nvim-lsp-installer/servers/arduino_language_server/init.lua b/lua/nvim-lsp-installer/servers/arduino_language_server/init.lua
deleted file mode 100644
index 303a180f..00000000
--- a/lua/nvim-lsp-installer/servers/arduino_language_server/init.lua
+++ /dev/null
@@ -1,62 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local github = require "nvim-lsp-installer.core.managers.github"
-local process = require "nvim-lsp-installer.core.process"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/arduino/arduino-language-server",
- languages = { "arduino" },
- installer = function()
- local opts = {
- repo = "arduino/arduino-language-server",
- asset_file = function(release)
- local target = coalesce(
- when(platform.is_mac, "arduino-language-server_%s_macOS_64bit.tar.gz"),
- when(
- platform.is_linux and platform.arch == "x64",
- "arduino-language-server_%s_Linux_64bit.tar.gz"
- ),
- when(
- platform.is_linux and platform.arch == "x86",
- "arduino-language-server_%s_Linux_32bit.tar.gz"
- ),
- when(
- platform.is_linux and platform.arch == "arm64",
- "arduino-language-server_%s_Linux_ARM64.tar.gz"
- ),
- when(
- platform.is_win and platform.arch == "x64",
- "arduino-language-server_0.6.0_Windows_64bit.zip"
- ),
- when(
- platform.is_win and platform.arch == "x86",
- "arduino-language-server_0.6.0_Windows_32bit.zip"
- )
- )
-
- return target and target:format(release)
- end,
- }
-
- platform.when {
- unix = function()
- github.untargz_release_file(opts).with_receipt()
- end,
- win = function()
- github.unzip_release_file(opts).with_receipt()
- end,
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/asm_lsp/init.lua b/lua/nvim-lsp-installer/servers/asm_lsp/init.lua
deleted file mode 100644
index 63c64c63..00000000
--- a/lua/nvim-lsp-installer/servers/asm_lsp/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "assembly-gas", "assembly-nasm", "assembly-go" },
- homepage = "https://github.com/bergercookie/asm-lsp",
- installer = cargo.crate "asm-lsp",
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/astro/init.lua b/lua/nvim-lsp-installer/servers/astro/init.lua
deleted file mode 100644
index a2515738..00000000
--- a/lua/nvim-lsp-installer/servers/astro/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "astro" },
- homepage = "https://github.com/withastro/language-tools/tree/main/packages/language-server",
- installer = npm.packages { "@astrojs/language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/awk_ls/init.lua b/lua/nvim-lsp-installer/servers/awk_ls/init.lua
deleted file mode 100644
index 457c6dbf..00000000
--- a/lua/nvim-lsp-installer/servers/awk_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "awk" },
- homepage = "https://github.com/Beaglefoot/awk-language-server",
- installer = npm.packages { "awk-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/bashls/init.lua b/lua/nvim-lsp-installer/servers/bashls/init.lua
deleted file mode 100644
index 5d1c3735..00000000
--- a/lua/nvim-lsp-installer/servers/bashls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "bash" },
- homepage = "https://github.com/bash-lsp/bash-language-server",
- installer = npm.packages { "bash-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/beancount/init.lua b/lua/nvim-lsp-installer/servers/beancount/init.lua
deleted file mode 100644
index bc35c080..00000000
--- a/lua/nvim-lsp-installer/servers/beancount/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "beancount" },
- homepage = "https://github.com/polarmutex/beancount-language-server",
- installer = cargo.crate "beancount-language-server",
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/bicep/init.lua b/lua/nvim-lsp-installer/servers/bicep/init.lua
deleted file mode 100644
index 78fff72d..00000000
--- a/lua/nvim-lsp-installer/servers/bicep/init.lua
+++ /dev/null
@@ -1,32 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local std = require "nvim-lsp-installer.core.managers.std"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "bicep" },
- homepage = "https://github.com/Azure/bicep",
- ---@param ctx InstallContext
- installer = function(ctx)
- std.ensure_executable("dotnet", { help_url = "https://dotnet.microsoft.com/download" })
- ctx.fs:mkdir "vscode"
- ctx:chdir("vscode", function()
- -- The bicep-langserver.zip is a bit broken on POSIX systems - so we download it via the VSCode distribution
- -- instead. See https://github.com/Azure/bicep/issues/3704.
- github.unzip_release_file({
- repo = "Azure/bicep",
- asset_file = "vscode-bicep.vsix",
- }).with_receipt()
- end)
- ctx.fs:rename(path.concat { "vscode", "extension", "bicepLanguageServer" }, "langserver")
- ctx.fs:rmrf "vscode"
- ctx:chdir "langserver"
- end,
- default_options = {
- cmd = { "dotnet", path.concat { root_dir, "Bicep.LangServer.dll" } },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/bsl_ls/init.lua b/lua/nvim-lsp-installer/servers/bsl_ls/init.lua
deleted file mode 100644
index 468f3ef6..00000000
--- a/lua/nvim-lsp-installer/servers/bsl_ls/init.lua
+++ /dev/null
@@ -1,31 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://1c-syntax.github.io/bsl-language-server",
- languages = { "onescript" },
- installer = function()
- std.ensure_executable "java"
- github.download_release_file({
- repo = "1c-syntax/bsl-language-server",
- out_file = "bsl-lsp.jar",
- asset_file = function(release)
- local version = release:gsub("^v", "")
- return ("bsl-language-server-%s-exec.jar"):format(version)
- end,
- }).with_receipt()
- end,
- default_options = {
- cmd = {
- "java",
- "-jar",
- path.concat { root_dir, "bsl-lsp.jar" },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/ccls/init.lua b/lua/nvim-lsp-installer/servers/ccls/init.lua
deleted file mode 100644
index 4302e58e..00000000
--- a/lua/nvim-lsp-installer/servers/ccls/init.lua
+++ /dev/null
@@ -1,24 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local process = require "nvim-lsp-installer.core.process"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/MaskRay/ccls",
- languages = { "c", "c++", "objective-c" },
- installer = function()
- platform.when {
- mac = require "nvim-lsp-installer.servers.ccls.mac",
- linux = require "nvim-lsp-installer.servers.ccls.linux",
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/clangd/init.lua b/lua/nvim-lsp-installer/servers/clangd/init.lua
deleted file mode 100644
index 40b4795d..00000000
--- a/lua/nvim-lsp-installer/servers/clangd/init.lua
+++ /dev/null
@@ -1,38 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local process = require "nvim-lsp-installer.core.process"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://clangd.llvm.org",
- languages = { "c", "c++" },
- ---@param ctx InstallContext
- installer = function(ctx)
- local source = github.unzip_release_file {
- repo = "clangd/clangd",
- asset_file = function(release)
- local target = coalesce(
- when(platform.is_mac, "clangd-mac-%s.zip"),
- when(platform.is_linux and platform.arch == "x64", "clangd-linux-%s.zip"),
- when(platform.is_win, "clangd-windows-%s.zip")
- )
- return target and target:format(release)
- end,
- }
- source.with_receipt()
- ctx.fs:rename(("clangd_%s"):format(source.release), "clangd")
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "clangd", "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/clarity_lsp/init.lua b/lua/nvim-lsp-installer/servers/clarity_lsp/init.lua
deleted file mode 100644
index e9a4ccaf..00000000
--- a/lua/nvim-lsp-installer/servers/clarity_lsp/init.lua
+++ /dev/null
@@ -1,31 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local github = require "nvim-lsp-installer.core.managers.github"
-local functional = require "nvim-lsp-installer.core.functional"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/hirosystems/clarity-lsp",
- languages = { "clarity" },
- installer = function()
- github.unzip_release_file({
- repo = "hirosystems/clarity-lsp",
- asset_file = coalesce(
- when(platform.is_mac, "clarity-lsp-macos-x64.zip"),
- when(platform.is_linux and platform.arch == "x64", "clarity-lsp-linux-x64.zip"),
- when(platform.is_win and platform.arch == "x64", "clarity-lsp-windows-x64.zip")
- ),
- }).with_receipt()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/clojure_lsp/init.lua b/lua/nvim-lsp-installer/servers/clojure_lsp/init.lua
deleted file mode 100644
index ecf32ff7..00000000
--- a/lua/nvim-lsp-installer/servers/clojure_lsp/init.lua
+++ /dev/null
@@ -1,33 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://clojure-lsp.io",
- languages = { "clojure" },
- installer = function()
- github.unzip_release_file({
- repo = "clojure-lsp/clojure-lsp",
- asset_file = coalesce(
- when(platform.is_mac, "clojure-lsp-native-macos-amd64.zip"),
- when(platform.is_linux, "clojure-lsp-native-linux-amd64.zip"),
- when(platform.is_win, "clojure-lsp-native-windows-amd64.zip")
- ),
- }).with_receipt()
- std.chmod("+x", { "clojure-lsp" })
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/cmake/init.lua b/lua/nvim-lsp-installer/servers/cmake/init.lua
deleted file mode 100644
index 5ef7ed21..00000000
--- a/lua/nvim-lsp-installer/servers/cmake/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/regen100/cmake-language-server",
- languages = { "cmake" },
- installer = pip3.packages { "cmake-language-server" },
- default_options = {
- cmd_env = pip3.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/codeqlls/init.lua b/lua/nvim-lsp-installer/servers/codeqlls/init.lua
deleted file mode 100644
index ccae55c0..00000000
--- a/lua/nvim-lsp-installer/servers/codeqlls/init.lua
+++ /dev/null
@@ -1,31 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local github = require "nvim-lsp-installer.core.managers.github"
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "codeql" },
- installer = function()
- github.unzip_release_file({
- repo = "github/codeql-cli-binaries",
- asset_file = coalesce(
- when(platform.is_mac, "codeql-osx64.zip"),
- when(platform.is_unix, "codeql-linux64.zip"),
- when(platform.is_win, "codeql-win64.zip")
- ),
- }).with_receipt()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "codeql" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/crystalline/init.lua b/lua/nvim-lsp-installer/servers/crystalline/init.lua
deleted file mode 100644
index 3e70cf7e..00000000
--- a/lua/nvim-lsp-installer/servers/crystalline/init.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local path = require "nvim-lsp-installer.core.path"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/elbywan/crystalline",
- languages = { "crystal" },
- installer = function()
- github.gunzip_release_file({
- repo = "elbywan/crystalline",
- asset_file = coalesce(
- when(platform.is_mac and platform.arch == "x64", "crystalline_x86_64-apple-darwin.gz"),
- when(platform.is_linux and platform.arch == "x64", "crystalline_x86_64-unknown-linux-gnu.gz")
- ),
- out_file = "crystalline",
- }).with_receipt()
- std.chmod("+x", { "crystalline" })
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir, path.concat { root_dir, "crystal", "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/csharp_ls/init.lua b/lua/nvim-lsp-installer/servers/csharp_ls/init.lua
deleted file mode 100644
index a39ab8e8..00000000
--- a/lua/nvim-lsp-installer/servers/csharp_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local dotnet = require "nvim-lsp-installer.core.managers.dotnet"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "c#" },
- homepage = "https://github.com/razzmatazz/csharp-language-server",
- installer = dotnet.package "csharp-ls",
- default_options = {
- cmd_env = dotnet.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/cssls/init.lua b/lua/nvim-lsp-installer/servers/cssls/init.lua
deleted file mode 100644
index 0f2c7e0c..00000000
--- a/lua/nvim-lsp-installer/servers/cssls/init.lua
+++ /dev/null
@@ -1 +0,0 @@
-return require "nvim-lsp-installer.servers.vscode-langservers-extracted" { "css" }
diff --git a/lua/nvim-lsp-installer/servers/cssmodules_ls/init.lua b/lua/nvim-lsp-installer/servers/cssmodules_ls/init.lua
deleted file mode 100644
index 28b0e232..00000000
--- a/lua/nvim-lsp-installer/servers/cssmodules_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/antonk52/cssmodules-language-server",
- languages = { "css" },
- installer = npm.packages { "cssmodules-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/cucumber_language_server/init.lua b/lua/nvim-lsp-installer/servers/cucumber_language_server/init.lua
deleted file mode 100644
index d4badc5d..00000000
--- a/lua/nvim-lsp-installer/servers/cucumber_language_server/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "cucumber" },
- homepage = "https://github.com/cucumber/language-server",
- installer = npm.packages { "@cucumber/language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/dartls/init.lua b/lua/nvim-lsp-installer/servers/dartls/init.lua
deleted file mode 100644
index 04f761e1..00000000
--- a/lua/nvim-lsp-installer/servers/dartls/init.lua
+++ /dev/null
@@ -1,13 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/dart-lang/sdk",
- languages = { "dart" },
- installer = std.system_executable("dart", { help_url = "https://dart.dev/get-dart" }),
- default_options = {},
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/denols/init.lua b/lua/nvim-lsp-installer/servers/denols/init.lua
deleted file mode 100644
index f4d64b2a..00000000
--- a/lua/nvim-lsp-installer/servers/denols/init.lua
+++ /dev/null
@@ -1,37 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://deno.land/x/deno/cli/lsp",
- languages = { "deno" },
- installer = function()
- github.unzip_release_file({
- repo = "denoland/deno",
- asset_file = coalesce(
- when(
- platform.is_mac,
- coalesce(
- when(platform.arch == "arm64", "deno-aarch64-apple-darwin.zip"),
- when(platform.arch == "x64", "deno-x86_64-apple-darwin.zip")
- )
- ),
- when(platform.is_linux, "deno-x86_64-unknown-linux-gnu.zip"),
- when(platform.is_win, "deno-x86_64-pc-windows-msvc.zip")
- ),
- }).with_receipt()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/dhall_lsp_server/init.lua b/lua/nvim-lsp-installer/servers/dhall_lsp_server/init.lua
deleted file mode 100644
index 484ae389..00000000
--- a/lua/nvim-lsp-installer/servers/dhall_lsp_server/init.lua
+++ /dev/null
@@ -1,68 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local _ = require "nvim-lsp-installer.core.functional"
-local std = require "nvim-lsp-installer.core.managers.std"
-local github_client = require "nvim-lsp-installer.core.managers.github.client"
-local Optional = require "nvim-lsp-installer.core.optional"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://dhall-lang.org/",
- languages = { "dhall" },
- ---@param ctx InstallContext
- installer = function(ctx)
- local repo = "dhall-lang/dhall-haskell"
- ---@type GitHubRelease
- local gh_release = ctx.requested_version
- :map(function(version)
- return github_client.fetch_release(repo, version)
- end)
- :or_else_get(function()
- return github_client.fetch_latest_release(repo)
- end)
- :get_or_throw()
-
- local asset_name_pattern = assert(
- _.coalesce(
- _.when(platform.is.mac, "dhall%-lsp%-server%-.+%-x86_64%-macos.tar.bz2"),
- _.when(platform.is.linux_x64, "dhall%-lsp%-server%-.+%-x86_64%-linux.tar.bz2"),
- _.when(platform.is.win_x64, "dhall%-lsp%-server%-.+%-x86_64%-windows.zip")
- )
- )
- local dhall_lsp_server_asset = _.find_first(
- _.prop_satisfies(_.matches(asset_name_pattern), "name"),
- gh_release.assets
- )
- Optional.of_nilable(dhall_lsp_server_asset)
- :if_present(
- ---@param asset GitHubReleaseAsset
- function(asset)
- if platform.is_win then
- std.download_file(asset.browser_download_url, "dhall-lsp-server.zip")
- std.unzip("dhall-lsp-server.zip", ".")
- else
- std.download_file(asset.browser_download_url, "dhall-lsp-server.tar.bz2")
- std.untar "dhall-lsp-server.tar.bz2"
- std.chmod("+x", { path.concat { "bin", "dhall-lsp-server" } })
- end
- ctx.receipt:with_primary_source {
- type = "github_release_file",
- repo = repo,
- file = asset.browser_download_url,
- release = gh_release.tag_name,
- }
- end
- )
- :or_else_throw "Unable to find the dhall-lsp-server release asset in the GitHub release."
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/diagnosticls/init.lua b/lua/nvim-lsp-installer/servers/diagnosticls/init.lua
deleted file mode 100644
index bbb6cf27..00000000
--- a/lua/nvim-lsp-installer/servers/diagnosticls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = {},
- homepage = "https://github.com/iamcco/diagnostic-languageserver",
- installer = npm.packages { "diagnostic-languageserver" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/dockerls/init.lua b/lua/nvim-lsp-installer/servers/dockerls/init.lua
deleted file mode 100644
index 466b9e0f..00000000
--- a/lua/nvim-lsp-installer/servers/dockerls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/rcjsuen/dockerfile-language-server-nodejs",
- languages = { "docker" },
- installer = npm.packages { "dockerfile-language-server-nodejs" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/dotls/init.lua b/lua/nvim-lsp-installer/servers/dotls/init.lua
deleted file mode 100644
index 0ffd8dab..00000000
--- a/lua/nvim-lsp-installer/servers/dotls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/nikeee/dot-language-server",
- languages = { "dot" },
- installer = npm.packages { "dot-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/efm/init.lua b/lua/nvim-lsp-installer/servers/efm/init.lua
deleted file mode 100644
index 6c431bee..00000000
--- a/lua/nvim-lsp-installer/servers/efm/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local go = require "nvim-lsp-installer.core.managers.go"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/mattn/efm-langserver",
- languages = {},
- installer = go.packages { "github.com/mattn/efm-langserver" },
- default_options = {
- cmd_env = go.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/elixirls/init.lua b/lua/nvim-lsp-installer/servers/elixirls/init.lua
deleted file mode 100644
index fc98dce7..00000000
--- a/lua/nvim-lsp-installer/servers/elixirls/init.lua
+++ /dev/null
@@ -1,35 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/elixir-lsp/elixir-ls",
- languages = { "elixir" },
- ---@param ctx InstallContext
- installer = function(ctx)
- -- We write to the elixir-ls directory for backwards compatibility reasons
- ctx.fs:mkdir "elixir-ls"
- ctx:chdir("elixir-ls", function()
- github.unzip_release_file({
- repo = "elixir-lsp/elixir-ls",
- asset_file = "elixir-ls.zip",
- }).with_receipt()
- std.chmod("+x", { "language_server.sh" })
- end)
- end,
- default_options = {
- cmd = {
- path.concat {
- root_dir,
- "elixir-ls",
- platform.is_win and "language_server.bat" or "language_server.sh",
- },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/elmls/init.lua b/lua/nvim-lsp-installer/servers/elmls/init.lua
deleted file mode 100644
index 7323a475..00000000
--- a/lua/nvim-lsp-installer/servers/elmls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/elm-tooling/elm-language-server",
- languages = { "elm" },
- installer = npm.packages { "@elm-tooling/elm-language-server", "elm", "elm-test", "elm-format" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/ember/init.lua b/lua/nvim-lsp-installer/servers/ember/init.lua
deleted file mode 100644
index 63eb4fc2..00000000
--- a/lua/nvim-lsp-installer/servers/ember/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "ember" },
- homepage = "https://github.com/lifeart/ember-language-server",
- installer = npm.packages { "@lifeart/ember-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/emmet_ls/init.lua b/lua/nvim-lsp-installer/servers/emmet_ls/init.lua
deleted file mode 100644
index 404fe6e2..00000000
--- a/lua/nvim-lsp-installer/servers/emmet_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/aca/emmet-ls",
- languages = { "emmet" },
- installer = npm.packages { "emmet-ls" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/erlangls/init.lua b/lua/nvim-lsp-installer/servers/erlangls/init.lua
deleted file mode 100644
index 2ae7403a..00000000
--- a/lua/nvim-lsp-installer/servers/erlangls/init.lua
+++ /dev/null
@@ -1,36 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local std = require "nvim-lsp-installer.core.managers.std"
-local git = require "nvim-lsp-installer.core.managers.git"
-local github = require "nvim-lsp-installer.core.managers.github"
-local Optional = require "nvim-lsp-installer.core.optional"
-
-return function(name, root_dir)
- local rebar3 = platform.is_win and "rebar3.cmd" or "rebar3"
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "erlang" },
- homepage = "https://erlang-ls.github.io/",
- ---@param ctx InstallContext
- installer = function(ctx)
- std.ensure_executable(rebar3, { help_url = "http://rebar3.org/docs/" })
-
- local repo = "erlang-ls/erlang_ls"
- local source = github.tag { repo = repo }
- source.with_receipt()
- git.clone { ("https://github.com/%s.git"):format(repo), version = Optional.of(source.tag) }
-
- ctx.spawn[rebar3] { "escriptize" }
- ctx.spawn[rebar3] { "as", "dap", "escriptize" }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "_build", "default", "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/esbonio/init.lua b/lua/nvim-lsp-installer/servers/esbonio/init.lua
deleted file mode 100644
index 06df4e5c..00000000
--- a/lua/nvim-lsp-installer/servers/esbonio/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "sphinx" },
- homepage = "https://pypi.org/project/esbonio/",
- installer = pip3.packages { "esbonio" },
- default_options = {
- cmd_env = pip3.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/eslint/README.md b/lua/nvim-lsp-installer/servers/eslint/README.md
deleted file mode 100644
index a8c2a301..00000000
--- a/lua/nvim-lsp-installer/servers/eslint/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# eslint
-
-*NOTE*: You will have to install the [`eslint` package](https://www.npmjs.com/package/eslint) either locally or globally for the server to run successfully.
-
-## Eslint in projects that use pnp
-
-To allow the `eslint` server to resolve eslint and eslint plugins in a project that uses yarn 2/pnp, you need to manually change the
-command used to run the server. This is done when setting up the LSP server, like so:
-
-```lua
-local eslint_config = require("lspconfig.server_configurations.eslint")
-lspconfig.eslint.setup {
- opts.cmd = { "yarn", "exec", unpack(eslint_config.default_config.cmd) }
-}
-```
diff --git a/lua/nvim-lsp-installer/servers/eslint/init.lua b/lua/nvim-lsp-installer/servers/eslint/init.lua
deleted file mode 100644
index 8fcb06fe..00000000
--- a/lua/nvim-lsp-installer/servers/eslint/init.lua
+++ /dev/null
@@ -1 +0,0 @@
-return require "nvim-lsp-installer.servers.vscode-langservers-extracted" { "eslint", "javascript", "typescript" }
diff --git a/lua/nvim-lsp-installer/servers/flux_lsp/init.lua b/lua/nvim-lsp-installer/servers/flux_lsp/init.lua
deleted file mode 100644
index d47e4a44..00000000
--- a/lua/nvim-lsp-installer/servers/flux_lsp/init.lua
+++ /dev/null
@@ -1,17 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "flux" },
- homepage = "https://github.com/influxdata/flux-lsp",
- installer = cargo.crate("https://github.com/influxdata/flux-lsp", {
- git = true,
- }),
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/foam_ls/init.lua b/lua/nvim-lsp-installer/servers/foam_ls/init.lua
deleted file mode 100644
index 79c09118..00000000
--- a/lua/nvim-lsp-installer/servers/foam_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/FoamScience/foam-language-server",
- languages = { "foam", "OpenFOAM" },
- installer = npm.packages { "foam-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/fortls/init.lua b/lua/nvim-lsp-installer/servers/fortls/init.lua
deleted file mode 100644
index 24b76dce..00000000
--- a/lua/nvim-lsp-installer/servers/fortls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/gnikit/fortls",
- languages = { "fortran" },
- installer = pip3.packages { "fortls" },
- default_options = {
- cmd_env = pip3.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/fsautocomplete/init.lua b/lua/nvim-lsp-installer/servers/fsautocomplete/init.lua
deleted file mode 100644
index d404e89f..00000000
--- a/lua/nvim-lsp-installer/servers/fsautocomplete/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local dotnet = require "nvim-lsp-installer.core.managers.dotnet"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "f#" },
- homepage = "https://github.com/fsharp/FsAutoComplete",
- installer = dotnet.package "fsautocomplete",
- default_options = {
- cmd_env = dotnet.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/golangci_lint_ls/init.lua b/lua/nvim-lsp-installer/servers/golangci_lint_ls/init.lua
deleted file mode 100644
index 58a85391..00000000
--- a/lua/nvim-lsp-installer/servers/golangci_lint_ls/init.lua
+++ /dev/null
@@ -1,18 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local go = require "nvim-lsp-installer.core.managers.go"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/nametake/golangci-lint-langserver",
- languages = { "go" },
- installer = go.packages {
- "github.com/nametake/golangci-lint-langserver",
- "github.com/golangci/golangci-lint/cmd/golangci-lint",
- },
- default_options = {
- cmd_env = go.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/gopls/init.lua b/lua/nvim-lsp-installer/servers/gopls/init.lua
deleted file mode 100644
index f83dbc65..00000000
--- a/lua/nvim-lsp-installer/servers/gopls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local go = require "nvim-lsp-installer.core.managers.go"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://pkg.go.dev/golang.org/x/tools/gopls",
- languages = { "go" },
- installer = go.packages { "golang.org/x/tools/gopls" },
- default_options = {
- cmd_env = go.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/grammarly/init.lua b/lua/nvim-lsp-installer/servers/grammarly/init.lua
deleted file mode 100644
index bd47ccab..00000000
--- a/lua/nvim-lsp-installer/servers/grammarly/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/znck/grammarly",
- languages = {},
- installer = npm.packages { "grammarly-languageserver" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/graphql/init.lua b/lua/nvim-lsp-installer/servers/graphql/init.lua
deleted file mode 100644
index 115478cb..00000000
--- a/lua/nvim-lsp-installer/servers/graphql/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://www.npmjs.com/package/graphql-language-service-cli",
- languages = { "graphql" },
- installer = npm.packages { "graphql-language-service-cli", "graphql" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/groovyls/init.lua b/lua/nvim-lsp-installer/servers/groovyls/init.lua
deleted file mode 100644
index 28316518..00000000
--- a/lua/nvim-lsp-installer/servers/groovyls/init.lua
+++ /dev/null
@@ -1,26 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local std = require "nvim-lsp-installer.core.managers.std"
-local git = require "nvim-lsp-installer.core.managers.git"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "groovy" },
- homepage = "https://github.com/GroovyLanguageServer/groovy-language-server",
- ---@param ctx InstallContext
- installer = function(ctx)
- std.ensure_executable "javac"
- git.clone({ "https://github.com/GroovyLanguageServer/groovy-language-server" }).with_receipt()
- ctx:promote_cwd()
- ctx.spawn.gradlew {
- "build",
- with_paths = { ctx.cwd:get() },
- }
- end,
- default_options = {
- cmd = { "java", "-jar", path.concat { root_dir, "build", "libs", "groovyls-all.jar" } },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/haxe_language_server/init.lua b/lua/nvim-lsp-installer/servers/haxe_language_server/init.lua
deleted file mode 100644
index b26e76df..00000000
--- a/lua/nvim-lsp-installer/servers/haxe_language_server/init.lua
+++ /dev/null
@@ -1,24 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local std = require "nvim-lsp-installer.core.managers.std"
-local git = require "nvim-lsp-installer.core.managers.git"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/vshaxe/haxe-language-server",
- languages = { "haxe" },
- ---@param ctx InstallContext
- installer = function(ctx)
- std.ensure_executable("haxelib", { help_url = "https://haxe.org" })
- git.clone({ "https://github.com/vshaxe/haxe-language-server" }).with_receipt()
- ctx.spawn.npm { "install" }
- npm.exec { "lix", "run", "vshaxe-build", "-t", "language-server" }
- end,
- default_options = {
- cmd = { "node", path.concat { root_dir, "bin", "server.js" } },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/hls/init.lua b/lua/nvim-lsp-installer/servers/hls/init.lua
deleted file mode 100644
index fe3cd3d0..00000000
--- a/lua/nvim-lsp-installer/servers/hls/init.lua
+++ /dev/null
@@ -1,42 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local process = require "nvim-lsp-installer.core.process"
-local std = require "nvim-lsp-installer.core.managers.std"
-local github_client = require "nvim-lsp-installer.core.managers.github.client"
-local path = require "nvim-lsp-installer.core.path"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://haskell-language-server.readthedocs.io/en/latest/",
- languages = { "haskell" },
- ---@param ctx InstallContext
- installer = function(ctx)
- local repo = "haskell/haskell-language-server"
- local release = ctx.requested_version:or_else_get(function()
- return github_client.fetch_latest_release(repo)
- :map(
- ---@param release GitHubRelease
- function(release)
- return release.tag_name
- end
- )
- :get_or_throw()
- end)
-
- std.ensure_executable("ghcup", { help_url = "https://www.haskell.org/ghcup/" })
- ctx:promote_cwd()
- ctx.spawn.ghcup { "install", "hls", release, "-i", ctx.cwd:get() }
-
- ctx.receipt:with_primary_source(ctx.receipt.github_release(repo, release))
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path {
- platform.is_win and root_dir or path.concat { root_dir, "bin" },
- },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/hoon_ls/init.lua b/lua/nvim-lsp-installer/servers/hoon_ls/init.lua
deleted file mode 100644
index 630595a6..00000000
--- a/lua/nvim-lsp-installer/servers/hoon_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "hoon" },
- homepage = "https://github.com/urbit/hoon-language-server",
- installer = npm.packages { "@urbit/hoon-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/html/init.lua b/lua/nvim-lsp-installer/servers/html/init.lua
deleted file mode 100644
index 37c6e7a9..00000000
--- a/lua/nvim-lsp-installer/servers/html/init.lua
+++ /dev/null
@@ -1 +0,0 @@
-return require "nvim-lsp-installer.servers.vscode-langservers-extracted" { "html" }
diff --git a/lua/nvim-lsp-installer/servers/init.lua b/lua/nvim-lsp-installer/servers/init.lua
deleted file mode 100644
index 935366e4..00000000
--- a/lua/nvim-lsp-installer/servers/init.lua
+++ /dev/null
@@ -1,297 +0,0 @@
-local _ = require "nvim-lsp-installer.core.functional"
-local path = require "nvim-lsp-installer.core.path"
-local fs = require "nvim-lsp-installer.core.fs"
-local settings = require "nvim-lsp-installer.settings"
-local log = require "nvim-lsp-installer.log"
-
-local M = {}
-
--- By default the install dir will be the same as the server's name.
--- There are two cases when servers should install to a different location:
--- 1. Legacy reasons, where some servers were previously installed to a location different than their name
--- 2. There is a breaking change to a server that motivates changing its install dir (e.g. to "bust" existing installations).
-local INSTALL_DIRS = {
- ["bashls"] = "bash",
- ["dockerls"] = "dockerfile",
- ["elixirls"] = "elixir",
- ["elmls"] = "elm",
- ["eslint"] = "vscode-eslint",
- ["gopls"] = "go",
- ["hls"] = "haskell",
- ["intelephense"] = "php",
- ["kotlin_language_server"] = "kotlin",
- ["phpactor"] = "phpactor-source",
- ["purescriptls"] = "purescript",
- ["pyright"] = "python",
- ["rust_analyzer"] = "rust",
- ["tailwindcss"] = "tailwindcss_npm",
- ["terraformls"] = "terraform",
- ["texlab"] = "latex",
- ["vimls"] = "vim",
- ["yamlls"] = "yaml",
-}
-
-local CORE_SERVERS = _.set_of {
- "angularls",
- "ansiblels",
- "apex_ls",
- "arduino_language_server",
- "asm_lsp",
- "astro",
- "awk_ls",
- "bashls",
- "beancount",
- "bicep",
- "bsl_ls",
- "ccls",
- "clangd",
- "clarity_lsp",
- "clojure_lsp",
- "cmake",
- "codeqlls",
- "crystalline",
- "csharp_ls",
- "cssls",
- "cssmodules_ls",
- "cucumber_language_server",
- "dartls",
- "denols",
- "dhall_lsp_server",
- "diagnosticls",
- "dockerls",
- "dotls",
- "efm",
- "elixirls",
- "elmls",
- "ember",
- "emmet_ls",
- "erlangls",
- "esbonio",
- "eslint",
- "flux_lsp",
- "foam_ls",
- "fortls",
- "fsautocomplete",
- "golangci_lint_ls",
- "gopls",
- "grammarly",
- "graphql",
- "groovyls",
- "haxe_language_server",
- "hls",
- "hoon_ls",
- "html",
- "intelephense",
- "jdtls",
- "jedi_language_server",
- "jsonls",
- "jsonnet_ls",
- "julials",
- "kotlin_language_server",
- "lelwel_ls",
- "lemminx",
- "ltex",
- "marksman",
- "mm0_ls",
- "nickel_ls",
- "nimls",
- "ocamlls",
- "ocamllsp",
- "omnisharp",
- "opencl_ls",
- "perlnavigator",
- "phpactor",
- "powershell_es",
- "prismals",
- "prosemd_lsp",
- "psalm",
- "puppet",
- "purescriptls",
- "pylsp",
- "pyright",
- "quick_lint_js",
- "r_language_server",
- "reason_ls",
- "remark_ls",
- "rescriptls",
- "rnix",
- "robotframework_ls",
- "rome",
- "rust_analyzer",
- "salt_ls",
- "scry",
- "serve_d",
- "slint_lsp",
- "solang",
- "solargraph",
- "solc",
- "solidity_ls",
- "sorbet",
- "sourcekit",
- "sourcery",
- "sqlls",
- "sqls",
- "stylelint_lsp",
- "sumneko_lua",
- "svelte",
- "svlangserver",
- "svls",
- "tailwindcss",
- "taplo",
- "teal_ls",
- "terraformls",
- "texlab",
- "tflint",
- "theme_check",
- "tsserver",
- "vala_ls",
- "verible",
- "vimls",
- "visualforce_ls",
- "vls",
- "volar",
- "vuels",
- "wgsl_analyzer",
- "yamlls",
- "zk",
- "zls",
-}
-
----@type table<string, Server>
-local INITIALIZED_SERVERS = {}
-
-local cached_server_roots
-
-local function scan_server_roots()
- if cached_server_roots then
- return cached_server_roots
- end
- log.trace "Scanning server roots"
- ---@type string[]
- local result = {}
- local ok, entries = pcall(fs.sync.readdir, settings.current.install_root_dir)
- if not ok then
- log.debug("Failed to scan server roots", entries)
- -- presume servers root dir has not been created yet (i.e., no servers installed)
- return {}
- end
- for i = 1, #entries do
- local entry = entries[i]
- if entry.type == "directory" then
- result[#result + 1] = entry.name
- end
- end
- cached_server_roots = _.set_of(result)
- vim.schedule(function()
- cached_server_roots = nil
- end)
- log.trace("Resolved server roots", cached_server_roots)
- return cached_server_roots
-end
-
----@param server_name string
----@return string
-local function get_server_install_dir(server_name)
- log.fmt_trace("Getting server installation dirname. uses_new_setup=%s", settings.uses_new_setup)
- if settings.uses_new_setup then
- return server_name
- else
- return INSTALL_DIRS[server_name] or server_name
- end
-end
-
-function M.get_server_install_path(dirname)
- log.trace("Getting server installation path", settings.current.install_root_dir, dirname)
- return path.concat { settings.current.install_root_dir, dirname }
-end
-
----@param server_name string
-function M.is_server_installed(server_name)
- log.trace("Checking if server is installed", server_name)
- local scanned_server_dirs = scan_server_roots()
- local dirname = get_server_install_dir(server_name)
- return scanned_server_dirs[dirname] or false
-end
-
----@param server_identifier string @The server identifier to parse.
----@return string, string|nil @Returns a (server_name, requested_version) tuple, where requested_version may be nil.
-function M.parse_server_identifier(server_identifier)
- return unpack(vim.split(server_identifier, "@"))
-end
-
----@param server_name string
----@return boolean, Server
-function M.get_server(server_name)
- if INITIALIZED_SERVERS[server_name] then
- return true, INITIALIZED_SERVERS[server_name]
- end
-
- if not CORE_SERVERS[server_name] then
- return false, ("Server %s does not exist."):format(server_name)
- end
-
- local ok, server_factory = pcall(require, ("nvim-lsp-installer.servers.%s"):format(server_name))
- if ok then
- log.trace("Initializing core server", server_name)
- INITIALIZED_SERVERS[server_name] = server_factory(
- server_name,
- M.get_server_install_path(get_server_install_dir(server_name))
- )
- return true, INITIALIZED_SERVERS[server_name]
- end
- return false,
- (
- "Unable to import server %s.\n\nThis is an unexpected error, please file an issue at %s with the following information:\n%s"
- ):format(server_name, "https://github.com/williamboman/nvim-lsp-installer", server_factory)
-end
-
----@type fun(server_names: string): Server[]
-local resolve_servers = _.map(function(server_name)
- local ok, server = M.get_server(server_name)
- if not ok then
- error(server)
- end
- return server
-end)
-
----@return string[]
-function M.get_available_server_names()
- return vim.tbl_keys(vim.tbl_extend("force", CORE_SERVERS, INITIALIZED_SERVERS))
-end
-
----@return string[]
-function M.get_installed_server_names()
- return vim.tbl_filter(function(server_name)
- return M.is_server_installed(server_name)
- end, M.get_available_server_names())
-end
-
----@return string[]
-function M.get_uninstalled_server_names()
- return vim.tbl_filter(function(server_name)
- return not M.is_server_installed(server_name)
- end, M.get_available_server_names())
-end
-
--- Expensive to call the first time - loads all server modules.
-function M.get_available_servers()
- return resolve_servers(M.get_available_server_names())
-end
-
--- Somewhat expensive to call the first time (depends on how many servers are currently installed).
-function M.get_installed_servers()
- return resolve_servers(M.get_installed_server_names())
-end
-
--- Expensive to call the first time (depends on how many servers are currently not installed).
-function M.get_uninstalled_servers()
- return resolve_servers(M.get_uninstalled_server_names())
-end
-
----@param server Server @The server to register.
-function M.register(server)
- INSTALL_DIRS[server.name] = vim.fn.fnamemodify(server.root_dir, ":t")
- INITIALIZED_SERVERS[server.name] = server
-end
-
-return M
diff --git a/lua/nvim-lsp-installer/servers/intelephense/init.lua b/lua/nvim-lsp-installer/servers/intelephense/init.lua
deleted file mode 100644
index 6fbf1c9c..00000000
--- a/lua/nvim-lsp-installer/servers/intelephense/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://intelephense.com",
- languages = { "php" },
- installer = npm.packages { "intelephense" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/jdtls/init.lua b/lua/nvim-lsp-installer/servers/jdtls/init.lua
deleted file mode 100644
index 64af9b78..00000000
--- a/lua/nvim-lsp-installer/servers/jdtls/init.lua
+++ /dev/null
@@ -1,97 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local installer = require "nvim-lsp-installer.core.installer"
-local eclipse = require "nvim-lsp-installer.core.clients.eclipse"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-return function(name, root_dir)
- ---@param workspace_root string
- ---@param workspace_path string|nil @The path to the server instance's current workspace. Can be nil when running in single file mode.
- local function get_cmd(workspace_root, workspace_path)
- local executable = vim.env.JAVA_HOME and path.concat { vim.env.JAVA_HOME, "bin", "java" } or "java"
- local jar = vim.fn.expand(path.concat { root_dir, "plugins", "org.eclipse.equinox.launcher_*.jar" })
- local lombok = vim.fn.expand(path.concat { root_dir, "lombok.jar" })
- local workspace_dir = vim.fn.fnamemodify(workspace_path or vim.fn.getcwd(), ":p:h:t")
-
- return {
- platform.is_win and ("%s.exe"):format(executable) or executable,
- "-Declipse.application=org.eclipse.jdt.ls.core.id1",
- "-Dosgi.bundles.defaultStartLevel=4",
- "-Declipse.product=org.eclipse.jdt.ls.core.product",
- "-Dlog.protocol=true",
- "-Dlog.level=ALL",
- "-Xms1g",
- "-Xmx2G",
- "-javaagent:" .. lombok,
- "--add-modules=ALL-SYSTEM",
- "--add-opens",
- "java.base/java.util=ALL-UNNAMED",
- "--add-opens",
- "java.base/java.lang=ALL-UNNAMED",
- "-jar",
- jar,
- "-configuration",
- path.concat {
- root_dir,
- functional.coalesce(
- functional.when(platform.is_mac, "config_mac"),
- functional.when(platform.is_linux, "config_linux"),
- functional.when(platform.is_win, "config_win")
- ),
- },
- "-data",
- path.concat { workspace_root, workspace_dir },
- }
- end
-
- local function download_jdtls()
- local ctx = installer.context()
- local version = ctx.requested_version:or_else_get(function()
- return eclipse.fetch_latest_jdtls_version():get_or_throw()
- end)
-
- std.download_file(
- ("https://download.eclipse.org/jdtls/snapshots/jdt-language-server-%s.tar.gz"):format(version),
- "archive.tar.gz"
- )
- std.untar "archive.tar.gz"
-
- ctx.receipt:with_primary_source {
- type = "jdtls",
- version = version,
- }
- end
-
- local function download_lombok()
- std.download_file("https://projectlombok.org/downloads/lombok.jar", "lombok.jar")
- end
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "java" },
- homepage = "https://github.com/eclipse/eclipse.jdt.ls",
- ---@param ctx InstallContext
- installer = function(ctx)
- std.ensure_executable "java"
- ctx:run_concurrently { download_jdtls, download_lombok }
- end,
- default_options = {
- cmd = get_cmd(
- vim.env.WORKSPACE and vim.env.WORKSPACE or path.concat { vim.env.HOME, "workspace" },
- vim.loop.cwd()
- ),
- on_new_config = function(config, workspace_path)
- -- We redefine the cmd in on_new_config because `cmd` will be invalid if the user has not installed
- -- jdtls when starting the session (due to vim.fn.expand returning an empty string, because it can't
- -- locate the file).
- config.cmd = get_cmd(
- vim.env.WORKSPACE and vim.env.WORKSPACE or path.concat { vim.env.HOME, "workspace" },
- workspace_path
- )
- end,
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/jedi_language_server/init.lua b/lua/nvim-lsp-installer/servers/jedi_language_server/init.lua
deleted file mode 100644
index b21ed897..00000000
--- a/lua/nvim-lsp-installer/servers/jedi_language_server/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "python" },
- homepage = "https://github.com/pappasam/jedi-language-server",
- installer = pip3.packages { "jedi-language-server" },
- default_options = {
- cmd_env = pip3.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/jsonls/init.lua b/lua/nvim-lsp-installer/servers/jsonls/init.lua
deleted file mode 100644
index 6f7d6059..00000000
--- a/lua/nvim-lsp-installer/servers/jsonls/init.lua
+++ /dev/null
@@ -1 +0,0 @@
-return require "nvim-lsp-installer.servers.vscode-langservers-extracted" { "json" }
diff --git a/lua/nvim-lsp-installer/servers/jsonnet_ls/init.lua b/lua/nvim-lsp-installer/servers/jsonnet_ls/init.lua
deleted file mode 100644
index a94c534f..00000000
--- a/lua/nvim-lsp-installer/servers/jsonnet_ls/init.lua
+++ /dev/null
@@ -1,16 +0,0 @@
-local path = require "nvim-lsp-installer.core.path"
-local server = require "nvim-lsp-installer.server"
-local go = require "nvim-lsp-installer.core.managers.go"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/grafana/jsonnet-language-server",
- installer = go.packages { "github.com/grafana/jsonnet-language-server" },
- default_options = {
- -- TODO: use env instead of cmd once https://github.com/neovim/nvim-lspconfig/pull/1559 is merged
- cmd = { path.concat { root_dir, "jsonnet-language-server" } },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/julials/init.lua b/lua/nvim-lsp-installer/servers/julials/init.lua
deleted file mode 100644
index 85f59303..00000000
--- a/lua/nvim-lsp-installer/servers/julials/init.lua
+++ /dev/null
@@ -1,102 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local std = require "nvim-lsp-installer.core.managers.std"
-local github = require "nvim-lsp-installer.core.managers.github"
-local platform = require "nvim-lsp-installer.core.platform"
-local fs = require "nvim-lsp-installer.core.fs"
-local _ = require "nvim-lsp-installer.core.functional"
-
-return function(name, root_dir)
- local server_script = [[
-using LanguageServer, SymbolServer, Pkg
-
-OLD_DEPOT_PATH = ARGS[1]
-SYMBOLSTORE_PATH = ARGS[2]
-ENV_PATH = ARGS[3]
-
-runserver(
- stdin,
- stdout,
- ENV_PATH,
- OLD_DEPOT_PATH,
- nothing,
- SYMBOLSTORE_PATH
-)
-]]
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/julia-vscode/LanguageServer.jl",
- languages = { "julia" },
- ---@param ctx InstallContext
- installer = function(ctx)
- std.ensure_executable("julia", { help_url = "https://julialang.org/downloads/" })
-
- ctx.fs:mkdir "vscode-package"
- ctx:chdir("vscode-package", function()
- github.unzip_release_file({
- repo = "julia-vscode/julia-vscode",
- asset_file = function(version)
- local version_number = version:gsub("^v", "")
- return ("language-julia-%s.vsix"):format(version_number)
- end,
- }).with_receipt()
- end)
-
- ctx.fs:rename(
- path.concat {
- "vscode-package",
- "extension",
- "scripts",
- },
- "scripts"
- )
- ctx.fs:rmrf "vscode-package"
-
- ctx.fs:write_file("nvim-lsp.jl", server_script)
- end,
- default_options = {
- on_new_config = function(config, new_root_dir)
- local env_path = config.julia_env_path and vim.fn.expand(config.julia_env_path)
- if not env_path then
- local file_exists = _.compose(fs.sync.file_exists, path.concat, _.concat { new_root_dir })
- if file_exists { "Project.toml" } and file_exists { "Manifest.toml" } then
- env_path = new_root_dir
- elseif file_exists { "JuliaProject.toml" } and file_exists { "JuliaManifest.toml" } then
- env_path = new_root_dir
- end
- end
-
- if not env_path then
- local ok, env = pcall(vim.fn.system, {
- "julia",
- "--startup-file=no",
- "--history-file=no",
- "-e",
- "using Pkg; print(dirname(Pkg.Types.Context().env.project_file))",
- })
- if ok then
- env_path = env
- end
- end
-
- config.cmd = {
- "julia",
- "--startup-file=no",
- "--history-file=no",
- "--depwarn=no",
- ("--project=%s"):format(path.concat { root_dir, "scripts", "environments", "languageserver" }),
- path.concat { root_dir, "nvim-lsp.jl" },
- vim.env.JULIA_DEPOT_PATH or "",
- path.concat { root_dir, "symbolstorev5" },
- env_path,
- }
- end,
- cmd_env = {
- JULIA_DEPOT_PATH = path.concat { root_dir, "lsdepot" },
- JULIA_LOAD_PATH = platform.is.win and ";" or ":",
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/kotlin_language_server/init.lua b/lua/nvim-lsp-installer/servers/kotlin_language_server/init.lua
deleted file mode 100644
index 43851b9a..00000000
--- a/lua/nvim-lsp-installer/servers/kotlin_language_server/init.lua
+++ /dev/null
@@ -1,30 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/fwcd/kotlin-language-server",
- languages = { "kotlin" },
- installer = function()
- github.unzip_release_file({
- repo = "fwcd/kotlin-language-server",
- asset_file = "server.zip",
- }).with_receipt()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path {
- path.concat {
- root_dir,
- "server",
- "bin",
- },
- },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/lelwel_ls/init.lua b/lua/nvim-lsp-installer/servers/lelwel_ls/init.lua
deleted file mode 100644
index 2aefd068..00000000
--- a/lua/nvim-lsp-installer/servers/lelwel_ls/init.lua
+++ /dev/null
@@ -1,17 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "lelwel" },
- homepage = "https://github.com/0x2a-42/lelwel",
- installer = cargo.crate("lelwel", {
- features = "lsp",
- }),
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/lemminx/init.lua b/lua/nvim-lsp-installer/servers/lemminx/init.lua
deleted file mode 100644
index 786c399e..00000000
--- a/lua/nvim-lsp-installer/servers/lemminx/init.lua
+++ /dev/null
@@ -1,46 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local process = require "nvim-lsp-installer.core.process"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "xml" },
- homepage = "https://github.com/eclipse/lemminx",
- ---@param ctx InstallContext
- installer = function(ctx)
- local unzipped_file = assert(
- coalesce(
- when(platform.is_mac, "lemminx-osx-x86_64"),
- when(platform.is_linux, "lemminx-linux"),
- when(platform.is_win, "lemminx-win32")
- ),
- ("Your operating system or architecture (%q) is not yet supported."):format(platform.arch)
- )
-
- std.download_file(
- ("https://download.jboss.org/jbosstools/vscode/snapshots/lemminx-binary/%s/%s.zip"):format(
- ctx.requested_version:or_else "0.19.2-655", -- TODO: resolve latest version dynamically
- unzipped_file
- ),
- "lemminx.zip"
- )
- std.unzip("lemminx.zip", ".")
- ctx.fs:rename(
- platform.is_win and ("%s.exe"):format(unzipped_file) or unzipped_file,
- platform.is_win and "lemminx.exe" or "lemminx"
- )
- ctx.receipt:with_primary_source(ctx.receipt.unmanaged)
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/ltex/init.lua b/lua/nvim-lsp-installer/servers/ltex/init.lua
deleted file mode 100644
index d1380eb9..00000000
--- a/lua/nvim-lsp-installer/servers/ltex/init.lua
+++ /dev/null
@@ -1,77 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local a = require "nvim-lsp-installer.core.async"
-local _ = require "nvim-lsp-installer.core.functional"
-local installer = require "nvim-lsp-installer.core.installer"
-local path = require "nvim-lsp-installer.core.path"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- local repo = "valentjn/ltex-ls"
- ---@async
- local function download_platform_dependent()
- local ctx = installer.context()
- local source = platform.when {
- unix = function()
- return github.untargz_release_file {
- repo = repo,
- asset_file = function(version)
- local target = coalesce(
- when(platform.is_mac, "ltex-ls-%s-mac-x64.tar.gz"),
- when(platform.is_linux, "ltex-ls-%s-linux-x64.tar.gz"),
- when(platform.is_win, "ltex-ls-%s-windows-x64.zip")
- )
- return target:format(version)
- end,
- }
- end,
- win = function()
- return github.unzip_release_file {
- repo = repo,
- asset_file = function(version)
- return ("ltex-ls-%s-windows-x64.zip"):format(version)
- end,
- }
- end,
- }
- source.with_receipt()
- ctx.fs:rename(("ltex-ls-%s"):format(source.release), "ltex-ls")
- end
-
- local function download_platform_independent()
- local ctx = installer.context()
- local source = github.untargz_release_file {
- repo = repo,
- asset_file = _.format "ltex-ls-%s.tar.gz",
- }
- source.with_receipt()
- ctx.fs:rename(("ltex-ls-%s"):format(source.release), "ltex-ls")
- end
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://valentjn.github.io/vscode-ltex",
- languages = { "latex" },
- ---@async
- installer = function()
- if vim.in_fast_event() then
- a.scheduler()
- end
- if vim.fn.executable "java" == 1 then
- download_platform_independent()
- else
- download_platform_dependent()
- end
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "ltex-ls", "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/marksman/init.lua b/lua/nvim-lsp-installer/servers/marksman/init.lua
deleted file mode 100644
index 00ef26cc..00000000
--- a/lua/nvim-lsp-installer/servers/marksman/init.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/artempyanykh/marksman",
- languages = { "markdown" },
- installer = function()
- github.download_release_file({
- repo = "artempyanykh/marksman",
- out_file = platform.is_win and "marksman.exe" or "marksman",
- asset_file = coalesce(
- when(platform.is.mac, "marksman-macos"),
- when(platform.is.linux_x64, "marksman-linux"),
- when(platform.is_win_x64, "marksman.exe")
- ),
- }).with_receipt()
- std.chmod("+x", { "marksman" })
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/mm0_ls/init.lua b/lua/nvim-lsp-installer/servers/mm0_ls/init.lua
deleted file mode 100644
index 6190953b..00000000
--- a/lua/nvim-lsp-installer/servers/mm0_ls/init.lua
+++ /dev/null
@@ -1,25 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local process = require "nvim-lsp-installer.core.process"
-local git = require "nvim-lsp-installer.core.managers.git"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "metamath-zero" },
- homepage = "https://github.com/digama0/mm0",
- ---@param ctx InstallContext
- installer = function(ctx)
- git.clone({ "https://github.com/digama0/mm0" }).with_receipt()
- ctx:chdir("mm0-rs", function()
- ctx.spawn.cargo { "build", "--release" }
- end)
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "mm0-rs", "target", "release" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/nickel_ls/init.lua b/lua/nvim-lsp-installer/servers/nickel_ls/init.lua
deleted file mode 100644
index c180639d..00000000
--- a/lua/nvim-lsp-installer/servers/nickel_ls/init.lua
+++ /dev/null
@@ -1,26 +0,0 @@
-local path = require "nvim-lsp-installer.core.path"
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-local git = require "nvim-lsp-installer.core.managers.git"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://nickel-lang.org/",
- languages = { "nickel" },
- installer = function(ctx)
- git.clone({ "https://github.com/tweag/nickel" }).with_receipt()
- ctx.spawn.cargo {
- "install",
- "--root",
- ".",
- "--path",
- path.concat { "lsp", "nls" },
- }
- end,
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/nimls/init.lua b/lua/nvim-lsp-installer/servers/nimls/init.lua
deleted file mode 100644
index fc38e116..00000000
--- a/lua/nvim-lsp-installer/servers/nimls/init.lua
+++ /dev/null
@@ -1,22 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local git = require "nvim-lsp-installer.core.managers.git"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/PMunch/nimlsp",
- languages = { "nim" },
- ---@param ctx InstallContext
- installer = function(ctx)
- git.clone({ "https://github.com/PMunch/nimlsp.git" }).with_receipt()
- ctx.spawn.nimble { "build", "-y", "--localdeps" }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/ocamlls/init.lua b/lua/nvim-lsp-installer/servers/ocamlls/init.lua
deleted file mode 100644
index 2d98e6ca..00000000
--- a/lua/nvim-lsp-installer/servers/ocamlls/init.lua
+++ /dev/null
@@ -1,19 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- deprecated = {
- message = "ocamlls is deprecated, use ocamllsp instead.",
- replace_with = "ocamllsp",
- },
- homepage = "https://github.com/ocaml-lsp/ocaml-language-server",
- languages = { "ocaml" },
- installer = npm.packages { "ocaml-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/ocamllsp/init.lua b/lua/nvim-lsp-installer/servers/ocamllsp/init.lua
deleted file mode 100644
index 0be2ce00..00000000
--- a/lua/nvim-lsp-installer/servers/ocamllsp/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local opam = require "nvim-lsp-installer.core.managers.opam"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/ocaml/ocaml-lsp",
- languages = { "ocaml" },
- installer = opam.packages { "ocaml-lsp-server" },
- default_options = {
- cmd_env = opam.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/omnisharp/init.lua b/lua/nvim-lsp-installer/servers/omnisharp/init.lua
deleted file mode 100644
index 36aac24c..00000000
--- a/lua/nvim-lsp-installer/servers/omnisharp/init.lua
+++ /dev/null
@@ -1,76 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local path = require "nvim-lsp-installer.core.path"
-local functional = require "nvim-lsp-installer.core.functional"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-local Result = require "nvim-lsp-installer.core.result"
-
-local coalesce, when = functional.coalesce, functional.when
-
----@param install_dir string
----@param use_mono boolean
-local generate_cmd = function(install_dir, use_mono)
- if use_mono then
- return {
- "mono",
- path.concat { install_dir, "omnisharp-mono", "OmniSharp.exe" },
- "--languageserver",
- "--hostPID",
- tostring(vim.fn.getpid()),
- }
- else
- return {
- "dotnet",
- path.concat { install_dir, "omnisharp", "OmniSharp.dll" },
- "--languageserver",
- "--hostPID",
- tostring(vim.fn.getpid()),
- }
- end
-end
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/OmniSharp/omnisharp-roslyn",
- languages = { "c#" },
- ---@param ctx InstallContext
- installer = function(ctx)
- Result.run_catching(function()
- std.ensure_executable("mono", { help_url = "https://www.mono-project.com/download/stable/" })
- end):recover(function()
- std.ensure_executable("dotnet", { help_url = "https://dotnet.microsoft.com/download" })
- end)
-
- ctx.fs:mkdir "omnisharp"
- ctx:chdir("omnisharp", function()
- github.unzip_release_file {
- repo = "OmniSharp/omnisharp-roslyn",
- asset_file = coalesce(
- when(platform.is.mac_x64, "omnisharp-osx-x64-net6.0.zip"),
- when(platform.is.mac_arm64, "omnisharp-osx-arm64-net6.0.zip"),
- when(platform.is.linux_x64, "omnisharp-linux-x64-net6.0.zip"),
- when(platform.is.linux_arm64, "omnisharp-linux-arm64-net6.0.zip"),
- when(platform.is.win_x64, "omnisharp-win-x64-net6.0.zip"),
- when(platform.is.win_arm64, "omnisharp-win-arm64-net6.0.zip")
- ),
- }
- end)
-
- ctx.fs:mkdir "omnisharp-mono"
- ctx:chdir("omnisharp-mono", function()
- github.unzip_release_file({
- repo = "OmniSharp/omnisharp-roslyn",
- asset_file = "omnisharp-mono.zip",
- }).with_receipt()
- end)
- end,
- default_options = {
- on_new_config = function(config)
- config.cmd = generate_cmd(root_dir, config.use_mono)
- end,
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/opencl_ls/init.lua b/lua/nvim-lsp-installer/servers/opencl_ls/init.lua
deleted file mode 100644
index 92c9fa1d..00000000
--- a/lua/nvim-lsp-installer/servers/opencl_ls/init.lua
+++ /dev/null
@@ -1,41 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/Galarius/opencl-language-server",
- languages = { "opencl" },
- installer = function()
- platform.when {
- unix = function()
- local asset_file = coalesce(
- when(platform.is_mac, "opencl-language-server-darwin-x86_64.tar.gz"),
- when(platform.is_linux and platform.arch == "x64", "opencl-language-server-linux-x86_64.tar.gz")
- )
- github.untargz_release_file({
- repo = "Galarius/opencl-language-server",
- asset_file = asset_file,
- }).with_receipt()
- end,
- win = function()
- github.unzip_release_file({
- repo = "Galarius/opencl-language-server",
- asset_file = "opencl-language-server-win32-x86_64.zip",
- }).with_receipt()
- end,
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/perlnavigator/init.lua b/lua/nvim-lsp-installer/servers/perlnavigator/init.lua
deleted file mode 100644
index 56ca88cc..00000000
--- a/lua/nvim-lsp-installer/servers/perlnavigator/init.lua
+++ /dev/null
@@ -1,20 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "perl" },
- homepage = "https://github.com/bscan/PerlNavigator",
- installer = npm.packages { "perlnavigator-server" },
- default_options = {
- cmd = {
- "node",
- path.concat { root_dir, "node_modules", "perlnavigator-server", "out", "server.js" },
- "--stdio",
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/phpactor/init.lua b/lua/nvim-lsp-installer/servers/phpactor/init.lua
deleted file mode 100644
index 6c151353..00000000
--- a/lua/nvim-lsp-installer/servers/phpactor/init.lua
+++ /dev/null
@@ -1,25 +0,0 @@
-local path = require "nvim-lsp-installer.core.path"
-local server = require "nvim-lsp-installer.server"
-local composer = require "nvim-lsp-installer.core.managers.composer"
-local git = require "nvim-lsp-installer.core.managers.git"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://phpactor.readthedocs.io/en/master/",
- languages = { "php" },
- installer = function()
- assert(platform.is_unix, "Phpactor only supports UNIX environments.")
- git.clone({ "https://github.com/phpactor/phpactor.git" }).with_receipt()
- composer.install()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/powershell_es/init.lua b/lua/nvim-lsp-installer/servers/powershell_es/init.lua
deleted file mode 100644
index 0aa64ea3..00000000
--- a/lua/nvim-lsp-installer/servers/powershell_es/init.lua
+++ /dev/null
@@ -1,23 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local std = require "nvim-lsp-installer.core.managers.std"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/PowerShell/PowerShellEditorServices",
- languages = { "powershell" },
- installer = function()
- std.ensure_executable("pwsh", { help_url = "https://github.com/PowerShell/PowerShell#get-powershell" })
- github.unzip_release_file({
- repo = "PowerShell/PowerShellEditorServices",
- asset_file = "PowerShellEditorServices.zip",
- }).with_receipt()
- end,
- default_options = {
- bundle_path = path.concat { root_dir },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/prismals/init.lua b/lua/nvim-lsp-installer/servers/prismals/init.lua
deleted file mode 100644
index a32c88a9..00000000
--- a/lua/nvim-lsp-installer/servers/prismals/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "prisma" },
- homepage = "https://github.com/prisma/language-tools",
- installer = npm.packages { "@prisma/language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/prosemd_lsp/init.lua b/lua/nvim-lsp-installer/servers/prosemd_lsp/init.lua
deleted file mode 100644
index b89e0d3e..00000000
--- a/lua/nvim-lsp-installer/servers/prosemd_lsp/init.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/kitten/prosemd-lsp",
- languages = { "markdown" },
- installer = function()
- github.download_release_file({
- repo = "kitten/prosemd-lsp",
- out_file = platform.is_win and "prosemd-lsp.exe" or "prosemd-lsp",
- asset_file = coalesce(
- when(platform.is_mac, "prosemd-lsp-macos"),
- when(platform.is_linux and platform.arch == "x64", "prosemd-lsp-linux"),
- when(platform.is_win and platform.arch == "x64", "prosemd-lsp-windows.exe")
- ),
- }).with_receipt()
- std.chmod("+x", { "prosemd-lsp" })
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/psalm/init.lua b/lua/nvim-lsp-installer/servers/psalm/init.lua
deleted file mode 100644
index 29f9754a..00000000
--- a/lua/nvim-lsp-installer/servers/psalm/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local composer = require "nvim-lsp-installer.core.managers.composer"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://psalm.dev/",
- languages = { "php" },
- installer = composer.packages { "vimeo/psalm" },
- default_options = {
- cmd_env = composer.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/puppet/init.lua b/lua/nvim-lsp-installer/servers/puppet/init.lua
deleted file mode 100644
index 2631dcd3..00000000
--- a/lua/nvim-lsp-installer/servers/puppet/init.lua
+++ /dev/null
@@ -1,25 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/puppetlabs/puppet-editor-services",
- languages = { "puppet" },
- installer = function()
- github.unzip_release_file({
- repo = "puppetlabs/puppet-editor-services",
- asset_file = function(version)
- return ("puppet_editor_services_%s.zip"):format(version)
- end,
- }).with_receipt()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/purescriptls/init.lua b/lua/nvim-lsp-installer/servers/purescriptls/init.lua
deleted file mode 100644
index cb1d4add..00000000
--- a/lua/nvim-lsp-installer/servers/purescriptls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "purescript" },
- homepage = "https://github.com/nwolverson/purescript-language-server",
- installer = npm.packages { "purescript-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/pylsp/init.lua b/lua/nvim-lsp-installer/servers/pylsp/init.lua
deleted file mode 100644
index 4f0a01d1..00000000
--- a/lua/nvim-lsp-installer/servers/pylsp/init.lua
+++ /dev/null
@@ -1,63 +0,0 @@
-local a = require "nvim-lsp-installer.core.async"
-local _ = require "nvim-lsp-installer.core.functional"
-local server = require "nvim-lsp-installer.server"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-local process = require "nvim-lsp-installer.core.process"
-local notify = require "nvim-lsp-installer.notify"
-local middleware = require "nvim-lsp-installer.middleware"
-local spawn = require "nvim-lsp-installer.core.spawn"
-
-return function(name, root_dir)
- middleware.register_server_hook(name, function()
- vim.api.nvim_create_user_command(
- "PylspInstall",
- a.scope(function(opts)
- local plugins = opts.fargs
- local plugins_str = table.concat(plugins, ", ")
- notify(("Installing %s..."):format(plugins_str))
- local result = spawn.pip {
- "install",
- "-U",
- "--disable-pip-version-check",
- plugins,
- stdio_sink = process.simple_sink(),
- with_paths = { pip3.venv_path(root_dir) },
- }
- if vim.in_fast_event() then
- a.scheduler()
- end
- result
- :on_success(function()
- notify(("Successfully installed pylsp plugins %s"):format(plugins_str))
- end)
- :on_failure(function()
- notify("Failed to install requested pylsp plugins.", vim.log.levels.ERROR)
- end)
- end),
- {
- desc = "[nvim-lsp-installer] Installs the provided packages in the same venv as pylsp.",
- nargs = "+",
- complete = _.always {
- "pyls-flake8",
- "pylsp-mypy",
- "pyls-spyder",
- "pyls-isort",
- "python-lsp-black",
- "pyls-memestra",
- "pylsp-rope",
- },
- }
- )
- end)
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "python" },
- homepage = "https://github.com/python-lsp/python-lsp-server",
- installer = pip3.packages { "python-lsp-server[all]" },
- default_options = {
- cmd_env = pip3.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/pyright/init.lua b/lua/nvim-lsp-installer/servers/pyright/init.lua
deleted file mode 100644
index 92b8dfc0..00000000
--- a/lua/nvim-lsp-installer/servers/pyright/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "python" },
- homepage = "https://github.com/microsoft/pyright",
- installer = npm.packages { "pyright" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/quick_lint_js/init.lua b/lua/nvim-lsp-installer/servers/quick_lint_js/init.lua
deleted file mode 100644
index f9397f9b..00000000
--- a/lua/nvim-lsp-installer/servers/quick_lint_js/init.lua
+++ /dev/null
@@ -1,55 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local path = require "nvim-lsp-installer.core.path"
-local functional = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local std = require "nvim-lsp-installer.core.managers.std"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://quick-lint-js.com/",
- languages = { "javascript" },
- ---@async
- installer = function()
- local repo = "quick-lint/quick-lint-js"
- local release_file = assert(
- coalesce(
- when(platform.is.mac_x64, "macos.tar.gz"),
- when(platform.is.mac_arm64, "macos-aarch64.tar.gz"),
- when(platform.is.linux_x64, "linux.tar.gz"),
- when(platform.is.linux_arm64, "linux-aarch64.tar.gz"),
- when(platform.is.linux_arm, "linux-armhf.tar.gz"),
- when(platform.is.win_x64, "windows.zip"),
- when(platform.is.win_arm64, "windows-arm64.zip"),
- when(platform.is.win_arm, "windows-arm.zip")
- ),
- "Current platform is not supported."
- )
-
- local source = github.tag { repo = repo }
- source.with_receipt()
-
- local url = ("https://c.quick-lint-js.com/releases/%s/manual/%s"):format(source.tag, release_file)
- platform.when {
- unix = function()
- std.download_file(url, "archive.tar.gz")
- std.untar("archive.tar.gz", { strip_components = 1 })
- end,
- win = function()
- std.download_file(url, "archive.zip")
- std.unzip("archive.zip", ".")
- end,
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/reason_ls/init.lua b/lua/nvim-lsp-installer/servers/reason_ls/init.lua
deleted file mode 100644
index 3abb4888..00000000
--- a/lua/nvim-lsp-installer/servers/reason_ls/init.lua
+++ /dev/null
@@ -1,35 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local path = require "nvim-lsp-installer.core.path"
-local functional = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "reason" },
- homepage = "https://github.com/jaredly/reason-language-server",
- ---@param ctx InstallContext
- installer = function(ctx)
- local archive_name = coalesce(
- when(platform.is_mac, "rls-macos"),
- when(platform.is_linux, "rls-linux"),
- when(platform.is_win, "rls-windows")
- )
- github.unzip_release_file({
- repo = "jaredly/reason-language-server",
- asset_file = ("%s.zip"):format(archive_name),
- }).with_receipt()
- ctx.fs:rename(archive_name, "reason")
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "reason" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/remark_ls/init.lua b/lua/nvim-lsp-installer/servers/remark_ls/init.lua
deleted file mode 100644
index 3cedbab0..00000000
--- a/lua/nvim-lsp-installer/servers/remark_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/remarkjs/remark-language-server",
- languages = { "markdown" },
- installer = npm.packages { "remark-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/rescriptls/init.lua b/lua/nvim-lsp-installer/servers/rescriptls/init.lua
deleted file mode 100644
index 398d2777..00000000
--- a/lua/nvim-lsp-installer/servers/rescriptls/init.lua
+++ /dev/null
@@ -1,23 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "rescript" },
- homepage = "https://github.com/rescript-lang/rescript-vscode",
- installer = function()
- github.unzip_release_file({
- repo = "rescript-lang/rescript-vscode",
- asset_file = function(version)
- return ("rescript-vscode-%s.vsix"):format(version)
- end,
- }).with_receipt()
- end,
- default_options = {
- cmd = { "node", path.concat { root_dir, "extension", "server", "out", "server.js" }, "--stdio" },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/rnix/init.lua b/lua/nvim-lsp-installer/servers/rnix/init.lua
deleted file mode 100644
index a79cec88..00000000
--- a/lua/nvim-lsp-installer/servers/rnix/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "nix" },
- homepage = "https://github.com/nix-community/rnix-lsp",
- installer = cargo.crate "rnix-lsp",
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/robotframework_ls/init.lua b/lua/nvim-lsp-installer/servers/robotframework_ls/init.lua
deleted file mode 100644
index b890d6fb..00000000
--- a/lua/nvim-lsp-installer/servers/robotframework_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- installer = pip3.packages { "robotframework-lsp" },
- languages = { "robot" },
- homepage = "https://github.com/robocorp/robotframework-lsp",
- default_options = {
- cmd_env = pip3.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/rome/init.lua b/lua/nvim-lsp-installer/servers/rome/init.lua
deleted file mode 100644
index c664ca2c..00000000
--- a/lua/nvim-lsp-installer/servers/rome/init.lua
+++ /dev/null
@@ -1,22 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-local Optional = require "nvim-lsp-installer.core.optional"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "typescript", "javascript" },
- homepage = "https://rome.tools",
- ---@param ctx InstallContext
- installer = function(ctx)
- ctx.requested_version = ctx.requested_version:or_(function()
- return Optional.of "10.0.7-nightly.2021.7.27"
- end)
- npm.install({ "rome" }).with_receipt()
- end,
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/rust_analyzer/init.lua b/lua/nvim-lsp-installer/servers/rust_analyzer/init.lua
deleted file mode 100644
index c3d228f4..00000000
--- a/lua/nvim-lsp-installer/servers/rust_analyzer/init.lua
+++ /dev/null
@@ -1,65 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://rust-analyzer.github.io",
- languages = { "rust" },
- installer = function()
- local libc = platform.get_libc()
-
- local asset_file = coalesce(
- when(
- platform.is_mac,
- coalesce(
- when(platform.arch == "arm64", "rust-analyzer-aarch64-apple-darwin.gz"),
- when(platform.arch == "x64", "rust-analyzer-x86_64-apple-darwin.gz")
- )
- ),
- when(
- platform.is_linux,
- coalesce(
- when(
- libc == "glibc",
- coalesce(
- when(platform.arch == "arm64", "rust-analyzer-aarch64-unknown-linux-gnu.gz"),
- when(platform.arch == "x64", "rust-analyzer-x86_64-unknown-linux-gnu.gz")
- )
- ),
- when(
- libc == "musl",
- coalesce(when(platform.arch == "x64", "rust-analyzer-x86_64-unknown-linux-musl.gz"))
- )
- )
- ),
- when(
- platform.is_win,
- coalesce(
- when(platform.arch == "arm64", "rust-analyzer-aarch64-pc-windows-msvc.gz"),
- when(platform.arch == "x64", "rust-analyzer-x86_64-pc-windows-msvc.gz")
- )
- )
- )
-
- github.gunzip_release_file({
- repo = "rust-lang/rust-analyzer",
- asset_file = asset_file,
- out_file = platform.is_win and "rust-analyzer.exe" or "rust-analyzer",
- }).with_receipt()
- std.chmod("+x", { "rust-analyzer" })
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/salt_ls/init.lua b/lua/nvim-lsp-installer/servers/salt_ls/init.lua
deleted file mode 100644
index bfc74069..00000000
--- a/lua/nvim-lsp-installer/servers/salt_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "sls" },
- homepage = "https://github.com/dcermak/salt-lsp",
- installer = pip3.packages { "salt-lsp" },
- default_options = {
- cmd_env = pip3.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/scry/init.lua b/lua/nvim-lsp-installer/servers/scry/init.lua
deleted file mode 100644
index bc6d678a..00000000
--- a/lua/nvim-lsp-installer/servers/scry/init.lua
+++ /dev/null
@@ -1,30 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local path = require "nvim-lsp-installer.core.path"
-local std = require "nvim-lsp-installer.core.managers.std"
-local git = require "nvim-lsp-installer.core.managers.git"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "crystal" },
- homepage = "https://github.com/crystal-lang-tools/scry",
- ---@param ctx InstallContext
- installer = function(ctx)
- std.ensure_executable("crystal", {
- help_url = "https://crystal-lang.org/install/",
- })
- std.ensure_executable("shards", {
- help_url = "https://crystal-lang.org/install/",
- })
- git.clone({ "https://github.com/crystal-lang-tools/scry.git" }).with_receipt()
- ctx.spawn.shards { "build", "--verbose", "--release" }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/serve_d/init.lua b/lua/nvim-lsp-installer/servers/serve_d/init.lua
deleted file mode 100644
index 04dfa674..00000000
--- a/lua/nvim-lsp-installer/servers/serve_d/init.lua
+++ /dev/null
@@ -1,47 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/Pure-D/serve-d",
- languages = { "d" },
- installer = function()
- local repo = "Pure-D/serve-d"
- platform.when {
- unix = function()
- github.untarxz_release_file({
- repo = repo,
- asset_file = function(release)
- local target = coalesce(
- when(platform.is_mac, "serve-d_%s-osx-x86_64.tar.xz"),
- when(platform.is_linux and platform.arch == "x64", "serve-d_%s-linux-x86_64.tar.xz")
- )
- return target and target:format(release:gsub("^v", ""))
- end,
- }).with_receipt()
- end,
- win = function()
- github.unzip_release_file({
- repo = repo,
- asset_file = function(release)
- local target = coalesce(when(platform.arch == "x64"), "serve-d_%s-windows-x86_64.zip")
- return target and target:format(release:gsub("^v", ""))
- end,
- }).with_receipt()
- end,
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/slint_lsp/init.lua b/lua/nvim-lsp-installer/servers/slint_lsp/init.lua
deleted file mode 100644
index 8ade21f1..00000000
--- a/lua/nvim-lsp-installer/servers/slint_lsp/init.lua
+++ /dev/null
@@ -1,36 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://slint-ui.com/",
- languages = { "slint" },
- installer = function()
- local repo = "slint-ui/slint"
- platform.when {
- win = function()
- github.unzip_release_file({
- repo = repo,
- asset_file = "slint-lsp-windows.zip",
- }).with_receipt()
- end,
- linux = function()
- github.untargz_release_file({
- repo = repo,
- asset_file = "slint-lsp-linux.tar.gz",
- }).with_receipt()
- end,
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "slint-lsp" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/solang/init.lua b/lua/nvim-lsp-installer/servers/solang/init.lua
deleted file mode 100644
index 877dc86e..00000000
--- a/lua/nvim-lsp-installer/servers/solang/init.lua
+++ /dev/null
@@ -1,70 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local process = require "nvim-lsp-installer.core.process"
-local std = require "nvim-lsp-installer.core.managers.std"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- ---@async
- local function download_solang()
- local source = github.download_release_file({
- repo = "hyperledger-labs/solang",
- out_file = platform.is_win and "solang.exe" or "solang",
- asset_file = coalesce(
- when(platform.is_mac and platform.arch == "x64", "solang-mac-intel"),
- when(platform.is_mac and platform.arch == "arm64", "solang-mac-arm"),
- when(platform.is_linux and platform.arch == "arm64", "solang-linux-arm64"),
- when(platform.is_linux and platform.arch == "x64", "solang-linux-x86-64"),
- when(platform.is_win, "solang.exe")
- ),
- }).with_receipt()
- std.chmod("+x", { "solang" })
- return source
- end
-
- ---@async
- ---Solang needs a build of llvm with some extra patches.
- local function download_llvm()
- local source = github.release_file {
- repo = "hyperledger-labs/solang",
- asset_file = coalesce(
- when(platform.is_mac and platform.arch == "x64", "llvm13.0-mac-intel.tar.xz"),
- when(platform.is_mac and platform.arch == "arm64", "llvm13.0-mac-arm.tar.xz"),
- when(platform.is_linux and platform.arch == "x64", "llvm13.0-linux-x86-64.tar.xz"),
- when(platform.is_linux and platform.arch == "arm64", "llvm13.0-linux-arm64.tar.xz"),
- when(platform.is_win, "llvm13.0-win.zip")
- ),
- }
- if platform.is_win then
- std.download_file(source.download_url, "llvm.zip")
- std.unzip("llvm.zip", ".")
- else
- std.download_file(source.download_url, "llvm.tar.xz")
- std.untar "llvm.tar.xz"
- end
- end
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://solang.readthedocs.io/en/latest/",
- languages = { "solidity" },
- ---@param ctx InstallContext
- installer = function(ctx)
- ctx:run_concurrently { download_solang, download_llvm }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path {
- path.concat { root_dir },
- path.concat { root_dir, "llvm13.0", "bin" },
- path.concat { root_dir, "llvm12.0", "bin" }, -- kept for backwards compatibility
- },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/solargraph/init.lua b/lua/nvim-lsp-installer/servers/solargraph/init.lua
deleted file mode 100644
index 0a6f1fe9..00000000
--- a/lua/nvim-lsp-installer/servers/solargraph/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local gem = require "nvim-lsp-installer.core.managers.gem"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "ruby" },
- homepage = "https://solargraph.org",
- installer = gem.packages { "solargraph" },
- default_options = {
- cmd_env = gem.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/solc/init.lua b/lua/nvim-lsp-installer/servers/solc/init.lua
deleted file mode 100644
index 1f74f56e..00000000
--- a/lua/nvim-lsp-installer/servers/solc/init.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/ethereum/solidity",
- languages = { "solidity" },
- installer = function()
- github.download_release_file({
- repo = "ethereum/solidity",
- out_file = platform.is_win and "solc.exe" or "solc",
- asset_file = coalesce(
- when(platform.is_mac, "solc-macos"),
- when(platform.is_linux, "solc-static-linux"),
- when(platform.is_win, "solc-windows.exe")
- ),
- }).with_receipt()
- std.chmod("+x", { "solc" })
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/solidity_ls/init.lua b/lua/nvim-lsp-installer/servers/solidity_ls/init.lua
deleted file mode 100644
index 1f8b6e71..00000000
--- a/lua/nvim-lsp-installer/servers/solidity_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "solidity" },
- homepage = "https://github.com/edag94/vscode-solidity",
- installer = npm.packages { "solidity-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/sorbet/init.lua b/lua/nvim-lsp-installer/servers/sorbet/init.lua
deleted file mode 100644
index 8095f289..00000000
--- a/lua/nvim-lsp-installer/servers/sorbet/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local gem = require "nvim-lsp-installer.core.managers.gem"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://sorbet.org/",
- languages = { "ruby" },
- installer = gem.packages { "sorbet" },
- default_options = {
- cmd_env = gem.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/sourcekit/init.lua b/lua/nvim-lsp-installer/servers/sourcekit/init.lua
deleted file mode 100644
index 7485701d..00000000
--- a/lua/nvim-lsp-installer/servers/sourcekit/init.lua
+++ /dev/null
@@ -1,13 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/apple/sourcekit-lsp",
- languages = { "swift" },
- installer = std.system_executable("sourcekit-lsp", { help_url = "https://github.com/apple/sourcekit-lsp" }),
- default_options = {},
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/sourcery/init.lua b/lua/nvim-lsp-installer/servers/sourcery/init.lua
deleted file mode 100644
index 98d3dff9..00000000
--- a/lua/nvim-lsp-installer/servers/sourcery/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local pip3 = require "nvim-lsp-installer.core.managers.pip3"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "python" },
- homepage = "https://docs.sourcery.ai/",
- installer = pip3.packages { "sourcery-cli" },
- default_options = {
- cmd_env = pip3.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/sqlls/init.lua b/lua/nvim-lsp-installer/servers/sqlls/init.lua
deleted file mode 100644
index dd818b82..00000000
--- a/lua/nvim-lsp-installer/servers/sqlls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "sql" },
- homepage = "https://github.com/joe-re/sql-language-server",
- installer = npm.packages { "sql-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/sqls/init.lua b/lua/nvim-lsp-installer/servers/sqls/init.lua
deleted file mode 100644
index f067bc0e..00000000
--- a/lua/nvim-lsp-installer/servers/sqls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local go = require "nvim-lsp-installer.core.managers.go"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "sql" },
- homepage = "https://github.com/lighttiger2505/sqls",
- installer = go.packages { "github.com/lighttiger2505/sqls" },
- default_options = {
- cmd_env = go.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/stylelint_lsp/init.lua b/lua/nvim-lsp-installer/servers/stylelint_lsp/init.lua
deleted file mode 100644
index a8e84e39..00000000
--- a/lua/nvim-lsp-installer/servers/stylelint_lsp/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/bmatcuk/stylelint-lsp",
- languages = { "stylelint" },
- installer = npm.packages { "stylelint-lsp" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/sumneko_lua/init.lua b/lua/nvim-lsp-installer/servers/sumneko_lua/init.lua
deleted file mode 100644
index 71a0f655..00000000
--- a/lua/nvim-lsp-installer/servers/sumneko_lua/init.lua
+++ /dev/null
@@ -1,56 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "lua" },
- homepage = "https://github.com/sumneko/lua-language-server",
- installer = function()
- github.unzip_release_file({
- repo = "sumneko/vscode-lua",
- asset_file = function(version)
- local target = coalesce(
- when(
- platform.is_mac,
- coalesce(
- when(platform.arch == "x64", "vscode-lua-%s-darwin-x64.vsix"),
- when(platform.arch == "arm64", "vscode-lua-%s-darwin-arm64.vsix")
- )
- ),
- when(
- platform.is_linux,
- coalesce(
- when(platform.arch == "x64", "vscode-lua-%s-linux-x64.vsix"),
- when(platform.arch == "arm64", "vscode-lua-%s-linux-arm64.vsix")
- )
- ),
- when(
- platform.is_win,
- coalesce(
- when(platform.arch == "x64", "vscode-lua-%s-win32-x64.vsix"),
- when(platform.arch == "x86", "vscode-lua-%s-win32-ia32.vsix")
- )
- )
- )
-
- return target and target:format(version)
- end,
- }).with_receipt()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path {
- path.concat { root_dir, "extension", "server", "bin" },
- },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/svelte/init.lua b/lua/nvim-lsp-installer/servers/svelte/init.lua
deleted file mode 100644
index f39c5fb0..00000000
--- a/lua/nvim-lsp-installer/servers/svelte/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "svelte" },
- homepage = "https://github.com/sveltejs/language-tools",
- installer = npm.packages { "svelte-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/svlangserver/init.lua b/lua/nvim-lsp-installer/servers/svlangserver/init.lua
deleted file mode 100644
index 56d2ecd4..00000000
--- a/lua/nvim-lsp-installer/servers/svlangserver/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/imc-trading/svlangserver",
- languages = { "systemverilog" },
- installer = npm.packages { "@imc-trading/svlangserver" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/svls/init.lua b/lua/nvim-lsp-installer/servers/svls/init.lua
deleted file mode 100644
index a8e59ff4..00000000
--- a/lua/nvim-lsp-installer/servers/svls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "systemverilog" },
- homepage = "https://github.com/dalance/svls",
- installer = cargo.crate "svls",
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/tailwindcss/init.lua b/lua/nvim-lsp-installer/servers/tailwindcss/init.lua
deleted file mode 100644
index fa7caa8f..00000000
--- a/lua/nvim-lsp-installer/servers/tailwindcss/init.lua
+++ /dev/null
@@ -1,14 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "tailwind" },
- installer = npm.packages { "@tailwindcss/language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/taplo/init.lua b/lua/nvim-lsp-installer/servers/taplo/init.lua
deleted file mode 100644
index a93c1a0f..00000000
--- a/lua/nvim-lsp-installer/servers/taplo/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "toml" },
- homepage = "https://taplo.tamasfe.dev/lsp/",
- installer = cargo.crate "taplo-cli",
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/teal_ls/init.lua b/lua/nvim-lsp-installer/servers/teal_ls/init.lua
deleted file mode 100644
index e1406355..00000000
--- a/lua/nvim-lsp-installer/servers/teal_ls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local luarocks = require "nvim-lsp-installer.core.managers.luarocks"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "teal" },
- homepage = "https://github.com/teal-language/teal-language-server",
- installer = luarocks.package("teal-language-server", { dev = true }),
- default_options = {
- cmd_env = luarocks.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/terraformls/init.lua b/lua/nvim-lsp-installer/servers/terraformls/init.lua
deleted file mode 100644
index 0a7be532..00000000
--- a/lua/nvim-lsp-installer/servers/terraformls/init.lua
+++ /dev/null
@@ -1,50 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/hashicorp/terraform-ls",
- languages = { "terraform" },
- installer = function()
- github.unzip_release_file({
- repo = "hashicorp/terraform-ls",
- asset_file = function(version)
- local target = coalesce(
- when(
- platform.is_mac,
- coalesce(
- when(platform.arch == "arm64", "terraform-ls_%s_darwin_arm64.zip"),
- when(platform.arch == "x64", "terraform-ls_%s_darwin_amd64.zip")
- )
- ),
- when(
- platform.is_linux,
- coalesce(
- when(platform.arch == "arm64", "terraform-ls_%s_linux_arm64.zip"),
- when(platform.arch == "arm", "terraform-ls_%s_linux_arm.zip"),
- when(platform.arch == "x64", "terraform-ls_%s_linux_amd64.zip")
- )
- ),
- when(
- platform.is_win,
- coalesce(when(platform.arch == "x64", "terraform-ls_%s_windows_amd64.zip"))
- )
- )
- return target and target:format(version:gsub("^v", ""))
- end,
- }).with_receipt()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/texlab/init.lua b/lua/nvim-lsp-installer/servers/texlab/init.lua
deleted file mode 100644
index e61c7b3c..00000000
--- a/lua/nvim-lsp-installer/servers/texlab/init.lua
+++ /dev/null
@@ -1,41 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/latex-lsp/texlab",
- languages = { "latex" },
- installer = function()
- local repo = "latex-lsp/texlab"
- platform.when {
- unix = function()
- github.untargz_release_file({
- repo = repo,
- asset_file = coalesce(
- when(platform.is_mac, "texlab-x86_64-macos.tar.gz"),
- when(platform.is_linux and platform.arch == "x64", "texlab-x86_64-linux.tar.gz")
- ),
- }).with_receipt()
- end,
- win = function()
- github.unzip_release_file({
- repo = repo,
- asset_file = coalesce(when(platform.arch == "x64", "texlab-x86_64-windows.zip")),
- }).with_receipt()
- end,
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/tflint/init.lua b/lua/nvim-lsp-installer/servers/tflint/init.lua
deleted file mode 100644
index bf370fe3..00000000
--- a/lua/nvim-lsp-installer/servers/tflint/init.lua
+++ /dev/null
@@ -1,66 +0,0 @@
-local a = require "nvim-lsp-installer.core.async"
-local notify = require "nvim-lsp-installer.notify"
-local spawn = require "nvim-lsp-installer.core.spawn"
-local process = require "nvim-lsp-installer.core.process"
-local server = require "nvim-lsp-installer.server"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local github = require "nvim-lsp-installer.core.managers.github"
-local middleware = require "nvim-lsp-installer.middleware"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- middleware.register_server_hook(name, function()
- vim.api.nvim_create_user_command(
- "TFLintInit",
- a.scope(function()
- notify "Installing TFLint plugins…"
- local result = spawn.tflint {
- "--init",
- cwd = vim.loop.cwd(),
- stdio_sink = process.simple_sink(),
- with_paths = { root_dir },
- }
- if vim.in_fast_event() then
- a.scheduler()
- end
- result
- :on_success(function()
- notify "Successfully installed TFLint plugins."
- end)
- :on_failure(function()
- notify("Failed to install TFLint plugins.", vim.log.levels.ERROR)
- end)
- end),
- {
- desc = "[nvim-lsp-installer] Runs tflint --init in the current directory.",
- }
- )
- end)
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "terraform" },
- homepage = "https://github.com/terraform-linters/tflint",
- installer = function()
- github.unzip_release_file({
- repo = "terraform-linters/tflint",
- asset_file = coalesce(
- when(platform.is_mac and platform.arch == "x64", "tflint_darwin_amd64.zip"),
- when(platform.is_mac and platform.arch == "arm64", "tflint_darwin_arm64.zip"),
- when(platform.is_linux and platform.arch == "x64", "tflint_linux_amd64.zip"),
- when(platform.is_linux and platform.arch == "arm64", "tflint_linux_arm64.zip"),
- when(platform.is_linux and platform.arch == "x86", "tflint_linux_386.zip"),
- when(platform.is_win and platform.arch == "x64", "tflint_windows_amd64.zip")
- ),
- }).with_receipt()
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/theme_check/init.lua b/lua/nvim-lsp-installer/servers/theme_check/init.lua
deleted file mode 100644
index e1bd3a3e..00000000
--- a/lua/nvim-lsp-installer/servers/theme_check/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local gem = require "nvim-lsp-installer.core.managers.gem"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "liquid" },
- homepage = "https://github.com/Shopify/theme-check",
- installer = gem.packages { "theme-check" },
- default_options = {
- cmd_env = gem.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/tsserver/init.lua b/lua/nvim-lsp-installer/servers/tsserver/init.lua
deleted file mode 100644
index d9e2571e..00000000
--- a/lua/nvim-lsp-installer/servers/tsserver/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "typescript", "javascript" },
- homepage = "https://github.com/typescript-language-server/typescript-language-server",
- installer = npm.packages { "typescript-language-server", "typescript" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/vala_ls/init.lua b/lua/nvim-lsp-installer/servers/vala_ls/init.lua
deleted file mode 100644
index e02720c0..00000000
--- a/lua/nvim-lsp-installer/servers/vala_ls/init.lua
+++ /dev/null
@@ -1,41 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local path = require "nvim-lsp-installer.core.path"
-local std = require "nvim-lsp-installer.core.managers.std"
-local github = require "nvim-lsp-installer.core.managers.github"
-local process = require "nvim-lsp-installer.core.process"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://wiki.gnome.org/Projects/Vala",
- languages = { "vala" },
- ---@param ctx InstallContext
- installer = function(ctx)
- std.ensure_executable("meson", { help_url = "https://mesonbuild.com/Getting-meson.html" })
- std.ensure_executable("ninja", { help_url = "https://ninja-build.org/" })
- std.ensure_executable("valac", { help_url = "https://wiki.gnome.org/Projects/Vala" })
-
- local release_source = github.untarxz_release_file {
- repo = "Prince781/vala-language-server",
- asset_file = function(version)
- return ("vala-language-server-%s.tar.xz"):format(version)
- end,
- }
- release_source.with_receipt()
-
- local vala_dirname = ("vala-language-server-%s"):format(release_source.release)
- local install_dir = ctx.cwd:get()
- ctx:chdir(vala_dirname, function()
- ctx.spawn.meson { ("-Dprefix=%s"):format(install_dir), "build" }
- ctx.spawn.ninja { "-C", "build", "install" }
- end)
- ctx.fs:rmrf(vala_dirname)
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "bin" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/verible/init.lua b/lua/nvim-lsp-installer/servers/verible/init.lua
deleted file mode 100644
index 6673deff..00000000
--- a/lua/nvim-lsp-installer/servers/verible/init.lua
+++ /dev/null
@@ -1,73 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local process = require "nvim-lsp-installer.core.process"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local path = require "nvim-lsp-installer.core.path"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://chipsalliance.github.io/verible/",
- languages = { "systemverilog", "verilog" },
- ---@param ctx InstallContext
- installer = function(ctx)
- local repo = "chipsalliance/verible"
- platform.when {
- linux = function()
- local os_dist = platform.os_distribution()
- local source = github.untarxz_release_file {
- repo = repo,
- asset_file = function(release)
- if os_dist.id == "ubuntu" then
- local target_file = when(
- platform.arch == "x64",
- coalesce(
- when(
- os_dist.version.major == 16,
- "verible-%s-Ubuntu-16.04-xenial-x86_64.tar.gz"
- ),
- when(
- os_dist.version.major == 18,
- "verible-%s-Ubuntu-18.04-bionic-x86_64.tar.gz"
- ),
- when(os_dist.version.major == 20, "verible-%s-Ubuntu-20.04-focal-x86_64.tar.gz"),
- when(os_dist.version.major == 22, "verible-%s-Ubuntu-22.04-jammy-x86_64.tar.gz")
- )
- )
- return target_file and target_file:format(release)
- end
- end,
- }
- source.with_receipt()
- ctx.fs:rename(("verible-%s"):format(source.release), "verible")
- end,
- win = function()
- local source = github.unzip_release_file {
- repo = repo,
- asset_file = function(release)
- local target_file = coalesce(when(platform.arch == "x64", "verible-%s-win64.zip"))
- return target_file and target_file:format(release)
- end,
- }
- source.with_receipt()
- ctx.fs:rename(("verible-%s-win64"):format(source.release), "verible")
- end,
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path {
- path.concat(coalesce(
- when(platform.is_win, { root_dir, "verible" }),
- when(platform.is_unix, { root_dir, "verible", "bin" }),
- { root_dir, "verible", "bin" } -- default
- )),
- },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/vimls/init.lua b/lua/nvim-lsp-installer/servers/vimls/init.lua
deleted file mode 100644
index ab5e72dc..00000000
--- a/lua/nvim-lsp-installer/servers/vimls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "vim" },
- homepage = "https://github.com/iamcco/vim-language-server",
- installer = npm.packages { "vim-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/visualforce_ls/init.lua b/lua/nvim-lsp-installer/servers/visualforce_ls/init.lua
deleted file mode 100644
index fb6b559e..00000000
--- a/lua/nvim-lsp-installer/servers/visualforce_ls/init.lua
+++ /dev/null
@@ -1,50 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local github = require "nvim-lsp-installer.core.managers.github"
-local github_client = require "nvim-lsp-installer.core.managers.github.client"
-local Optional = require "nvim-lsp-installer.core.optional"
-local path = require "nvim-lsp-installer.core.path"
-local _ = require "nvim-lsp-installer.core.functional"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/forcedotcom/salesforcedx-vscode",
- languages = { "visualforce" },
- ---@async
- installer = function()
- local repo = "forcedotcom/salesforcedx-vscode"
-
- -- See https://github.com/forcedotcom/salesforcedx-vscode/issues/4184#issuecomment-1146052086
- ---@type GitHubRelease
- local release = github_client
- .fetch_releases(repo)
- :map(_.find_first(_.prop_satisfies(_.compose(_.gt(0), _.length), "assets")))
- :map(Optional.of_nilable)
- :get_or_throw() -- Result unwrap
- :or_else_throw "Failed to find release with assets." -- Optional unwrap
-
- github.unzip_release_file({
- version = Optional.of(release.tag_name),
- asset_file = _.compose(_.format "salesforcedx-vscode-visualforce-%s.vsix", _.gsub("^v", "")),
- repo = repo,
- }).with_receipt()
- end,
- default_options = {
- cmd = {
- "node",
- path.concat {
- root_dir,
- "extension",
- "node_modules",
- "@salesforce",
- "salesforcedx-visualforce-language-server",
- "out",
- "src",
- "visualforceServer.js",
- },
- "--stdio",
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/vls/init.lua b/lua/nvim-lsp-installer/servers/vls/init.lua
deleted file mode 100644
index c531d2f6..00000000
--- a/lua/nvim-lsp-installer/servers/vls/init.lua
+++ /dev/null
@@ -1,42 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local github = require "nvim-lsp-installer.core.managers.github"
-local github_client = require "nvim-lsp-installer.core.managers.github.client"
-local std = require "nvim-lsp-installer.core.managers.std"
-local functional = require "nvim-lsp-installer.core.functional"
-local platform = require "nvim-lsp-installer.core.platform"
-local Optional = require "nvim-lsp-installer.core.optional"
-local process = require "nvim-lsp-installer.core.process"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/vlang/vls",
- languages = { "vlang", "V" },
- ---@async
- installer = function()
- local repo = "vlang/vls"
-
- ---@type GitHubRelease
- local latest_dev_build =
- github_client.fetch_latest_release(repo, { include_prerelease = true }):get_or_throw()
-
- github.download_release_file({
- version = Optional.of(latest_dev_build.tag_name),
- repo = repo,
- out_file = platform.is.win and "vls.exe" or "vls",
- asset_file = functional.coalesce(
- functional.when(platform.is.linux_x64, "vls_linux_x64"),
- functional.when(platform.is.mac, "vls_macos_x64"),
- functional.when(platform.is.win_x64, "vls_windows_x64.exe")
- ),
- }).with_receipt()
- std.chmod("+x", { "vls" })
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/volar/init.lua b/lua/nvim-lsp-installer/servers/volar/init.lua
deleted file mode 100644
index 725d086f..00000000
--- a/lua/nvim-lsp-installer/servers/volar/init.lua
+++ /dev/null
@@ -1,37 +0,0 @@
-local a = require "nvim-lsp-installer.core.async"
-local path = require "nvim-lsp-installer.core.path"
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-local fs = require "nvim-lsp-installer.core.fs"
-
-return function(name, root_dir)
- ---@param dir string
- local function get_tsserverlib_path(dir)
- return path.concat { dir, "node_modules", "typescript", "lib", "tsserverlibrary.js" }
- end
-
- ---@param workspace_dir string|nil
- local function get_typescript_server_path(workspace_dir)
- local local_tsserverlib = workspace_dir ~= nil and get_tsserverlib_path(workspace_dir)
- local vendored_tsserverlib = get_tsserverlib_path(root_dir)
- if local_tsserverlib and fs.sync.file_exists(local_tsserverlib) then
- return local_tsserverlib
- else
- return vendored_tsserverlib
- end
- end
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/johnsoncodehk/volar",
- languages = { "vue" },
- installer = npm.packages { "@volar/vue-language-server", "typescript" },
- default_options = {
- cmd_env = npm.env(root_dir),
- on_new_config = function(new_config, new_root_dir)
- new_config.init_options.typescript.serverPath = get_typescript_server_path(new_root_dir)
- end,
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/vscode-langservers-extracted/init.lua b/lua/nvim-lsp-installer/servers/vscode-langservers-extracted/init.lua
deleted file mode 100644
index a8441328..00000000
--- a/lua/nvim-lsp-installer/servers/vscode-langservers-extracted/init.lua
+++ /dev/null
@@ -1,17 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
----@param languages string[]
-return function(languages)
- return function(name, root_dir)
- return server.Server:new {
- name = name,
- languages = languages,
- root_dir = root_dir,
- installer = npm.packages { "vscode-langservers-extracted" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
- end
-end
diff --git a/lua/nvim-lsp-installer/servers/vuels/init.lua b/lua/nvim-lsp-installer/servers/vuels/init.lua
deleted file mode 100644
index 5d403953..00000000
--- a/lua/nvim-lsp-installer/servers/vuels/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "vue" },
- homepage = "https://github.com/vuejs/vetur",
- installer = npm.packages { "vls" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/wgsl_analyzer/init.lua b/lua/nvim-lsp-installer/servers/wgsl_analyzer/init.lua
deleted file mode 100644
index b7bd9554..00000000
--- a/lua/nvim-lsp-installer/servers/wgsl_analyzer/init.lua
+++ /dev/null
@@ -1,19 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local cargo = require "nvim-lsp-installer.core.managers.cargo"
-
-return function(name, root_dir)
- local homepage = "https://github.com/wgsl-analyzer/wgsl-analyzer"
-
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "wgsl" },
- homepage = homepage,
- installer = cargo.crate("wgsl_analyzer", {
- git = homepage,
- }),
- default_options = {
- cmd_env = cargo.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/yamlls/init.lua b/lua/nvim-lsp-installer/servers/yamlls/init.lua
deleted file mode 100644
index 0cfb3e41..00000000
--- a/lua/nvim-lsp-installer/servers/yamlls/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local npm = require "nvim-lsp-installer.core.managers.npm"
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- languages = { "yaml" },
- homepage = "https://github.com/redhat-developer/yaml-language-server",
- installer = npm.packages { "yaml-language-server" },
- default_options = {
- cmd_env = npm.env(root_dir),
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/zk/init.lua b/lua/nvim-lsp-installer/servers/zk/init.lua
deleted file mode 100644
index e309c4fd..00000000
--- a/lua/nvim-lsp-installer/servers/zk/init.lua
+++ /dev/null
@@ -1,54 +0,0 @@
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-
-local coalesce, when = functional.coalesce, functional.when
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/mickael-menu/zk",
- languages = { "markdown" },
- installer = function()
- local repo = "mickael-menu/zk"
- platform.when {
- mac = function()
- github.unzip_release_file({
- repo = repo,
- asset_file = coalesce(
- when(platform.arch == "arm64", function(version)
- return ("zk-%s-macos-arm64.zip"):format(version)
- end),
- when(platform.arch == "x64", function(version)
- return ("zk-%s-macos-x86_64.zip"):format(version)
- end)
- ),
- }):with_receipt()
- end,
- linux = function()
- github.untargz_release_file({
- repo = repo,
- asset_file = coalesce(
- when(platform.arch == "arm64", function(version)
- return ("zk-%s-linux-arm64.tar.gz"):format(version)
- end),
- when(platform.arch == "x64", function(version)
- return ("zk-%s-linux-amd64.tar.gz"):format(version)
- end),
- when(platform.arch == "x86", function(version)
- return ("zk-%s-linux-i386.tar.gz"):format(version)
- end)
- ),
- }).with_receipt()
- end,
- }
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { root_dir },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/servers/zls/init.lua b/lua/nvim-lsp-installer/servers/zls/init.lua
deleted file mode 100644
index 1b262d77..00000000
--- a/lua/nvim-lsp-installer/servers/zls/init.lua
+++ /dev/null
@@ -1,43 +0,0 @@
-local path = require "nvim-lsp-installer.core.path"
-local server = require "nvim-lsp-installer.server"
-local platform = require "nvim-lsp-installer.core.platform"
-local functional = require "nvim-lsp-installer.core.functional"
-local process = require "nvim-lsp-installer.core.process"
-local github = require "nvim-lsp-installer.core.managers.github"
-local std = require "nvim-lsp-installer.core.managers.std"
-
-local coalesce, when = functional.coalesce, functional.when
-
-return function(name, root_dir)
- return server.Server:new {
- name = name,
- root_dir = root_dir,
- homepage = "https://github.com/zigtools/zls",
- languages = { "zig" },
- ---@param ctx InstallContext
- installer = function(ctx)
- local asset_file = coalesce(
- when(platform.is_mac, "x86_64-macos.tar.xz"),
- when(
- platform.is_linux,
- coalesce(
- when(platform.arch == "x64", "x86_64-linux.tar.xz"),
- when(platform.arch == "x86", "i386-linux.tar.xz")
- )
- ),
- when(platform.is_win and platform.arch == "x64", "x86_64-windows.tar.xz")
- )
- github.untarxz_release_file({
- repo = "zigtools/zls",
- asset_file = asset_file,
- }).with_receipt()
- ctx.fs:rename("bin", "package")
- std.chmod("+x", { path.concat { "package", "zls" } })
- end,
- default_options = {
- cmd_env = {
- PATH = process.extend_path { path.concat { root_dir, "package" } },
- },
- },
- }
-end
diff --git a/lua/nvim-lsp-installer/settings.lua b/lua/nvim-lsp-installer/settings.lua
deleted file mode 100644
index d84b60af..00000000
--- a/lua/nvim-lsp-installer/settings.lua
+++ /dev/null
@@ -1,94 +0,0 @@
-local path = require "nvim-lsp-installer.core.path"
-
-local M = {}
-
----@class LspInstallerSettings
-local DEFAULT_SETTINGS = {
- -- A list of servers to automatically install if they're not already installed. Example: { "rust_analyzer", "sumneko_lua" }
- -- This setting has no relation with the `automatic_installation` setting.
- ensure_installed = {},
-
- -- Whether servers that are set up (via lspconfig) should be automatically installed if they're not already installed.
- -- This setting has no relation with the `ensure_installed` setting.
- -- Can either be:
- -- - false: Servers are not automatically installed.
- -- - true: All servers set up via lspconfig are automatically installed.
- -- - { exclude: string[] }: All servers set up via lspconfig, except the ones provided in the list, are automatically installed.
- -- Example: automatic_installation = { exclude = { "rust_analyzer", "solargraph" } }
- automatic_installation = false,
-
- ui = {
- -- Whether to automatically check for outdated servers when opening the UI window.
- check_outdated_servers_on_open = true,
-
- -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|.
- border = "none",
-
- icons = {
- -- The list icon to use for installed servers.
- server_installed = "◍",
- -- The list icon to use for servers that are pending installation.
- server_pending = "◍",
- -- The list icon to use for servers that are not installed.
- server_uninstalled = "◍",
- },
- keymaps = {
- -- Keymap to expand a server in the UI
- toggle_server_expand = "<CR>",
- -- Keymap to install the server under the current cursor position
- install_server = "i",
- -- Keymap to reinstall/update the server under the current cursor position
- update_server = "u",
- -- Keymap to check for new version for the server under the current cursor position
- check_server_version = "c",
- -- Keymap to update all installed servers
- update_all_servers = "U",
- -- Keymap to check which installed servers are outdated
- check_outdated_servers = "C",
- -- Keymap to uninstall a server
- uninstall_server = "X",
- },
- },
-
- -- The directory in which to install all servers.
- install_root_dir = path.concat { vim.fn.stdpath "data", "lsp_servers" },
-
- pip = {
- -- These args will be added to `pip install` calls. Note that setting extra args might impact intended behavior
- -- and is not recommended.
- --
- -- Example: { "--proxy", "https://proxyserver" }
- install_args = {},
- },
-
- -- Controls to which degree logs are written to the log file. It's useful to set this to vim.log.levels.DEBUG when
- -- debugging issues with server installations.
- log_level = vim.log.levels.INFO,
-
- -- Limit for the maximum amount of servers to be installed at the same time. Once this limit is reached, any further
- -- servers that are requested to be installed will be put in a queue.
- max_concurrent_installers = 4,
-
- github = {
- -- The template URL to use when downloading assets from GitHub.
- -- The placeholders are the following (in order):
- -- 1. The repository (e.g. "rust-lang/rust-analyzer")
- -- 2. The release version (e.g. "v0.3.0")
- -- 3. The asset name (e.g. "rust-analyzer-v0.3.0-x86_64-unknown-linux-gnu.tar.gz")
- download_url_template = "https://github.com/%s/releases/download/%s/%s",
- },
-}
-
-M._DEFAULT_SETTINGS = DEFAULT_SETTINGS
-M.current = M._DEFAULT_SETTINGS
-
----@param opts LspInstallerSettings
-function M.set(opts)
- M.current = vim.tbl_deep_extend("force", M.current, opts)
-end
-
--- Whether the new .setup() function has been called.
--- This will temporarily be used as a flag to toggle certain behavior.
-M.uses_new_setup = false
-
-return M
diff --git a/lua/nvim-lsp-installer/ui/init.lua b/lua/nvim-lsp-installer/ui/init.lua
deleted file mode 100644
index 33816b11..00000000
--- a/lua/nvim-lsp-installer/ui/init.lua
+++ /dev/null
@@ -1,1106 +0,0 @@
-local a = require "nvim-lsp-installer.core.async"
-local Ui = require "nvim-lsp-installer.core.ui"
-local display = require "nvim-lsp-installer.core.ui.display"
-local fs = require "nvim-lsp-installer.core.fs"
-local log = require "nvim-lsp-installer.log"
-local _ = require "nvim-lsp-installer.core.functional"
-local settings = require "nvim-lsp-installer.settings"
-local lsp_servers = require "nvim-lsp-installer.servers"
-local JobExecutionPool = require "nvim-lsp-installer.jobs.pool"
-local outdated_servers = require "nvim-lsp-installer.jobs.outdated-servers"
-local version_check = require "nvim-lsp-installer.jobs.version-check"
-local ServerHints = require "nvim-lsp-installer.ui.server_hints"
-local ServerSettingsSchema = require "nvim-lsp-installer.ui.components.settings-schema"
-
-local HELP_KEYMAP = "?"
-local CLOSE_WINDOW_KEYMAP_1 = "<Esc>"
-local CLOSE_WINDOW_KEYMAP_2 = "q"
-
----@param props {title: string, diagnostics: table|nil, subtitle: string[][], count: number}
-local function ServerGroupHeading(props)
- local line = {
- { props.title, props.highlight or "LspInstallerHeading" },
- { " (" .. props.count .. ") ", "Comment" },
- }
- if props.subtitle then
- vim.list_extend(line, props.subtitle)
- end
- return Ui.Node {
- Ui.HlTextNode { line },
- Ui.When(props.diagnostics, Ui.DiagnosticsNode(props.diagnostics)),
- }
-end
-
-local function Indent(children)
- return Ui.CascadingStyleNode({ "INDENT" }, children)
-end
-
-local create_vader = _.memoize(
- ---@param saber_ticks number
- function(saber_ticks)
- -- stylua: ignore start
- return {
- { { [[ _________________________________________________________________________________________ ]], "LspInstallerMuted" } },
- { { [[ < Help sponsor nvim-lsp-installer development! ]], "LspInstallerMuted" }, { "https://github.com/sponsors/williamboman", "LspInstallerHighlighted"}, {[[ > ]], "LspInstallerMuted" } },
- { { [[ < Help sponsor neovim development! ]], "LspInstallerMuted" }, { "https://github.com/sponsors/neovim", "LspInstallerHighlighted"}, {[[ > ]], "LspInstallerMuted" } },
- { { [[ ----------------------------------------------------------------------------------------- ]], "LspInstallerMuted" } },
- { { [[ ]], ""}, {[[\]], saber_ticks >= 3 and "LspInstallerVaderSaber" or "LspInstallerMuted"}, {[[ ,-^-. ]], "LspInstallerMuted" } },
- { { [[ ]], ""}, {[[\]], saber_ticks >= 2 and "LspInstallerVaderSaber" or "LspInstallerMuted"}, {[[ !oYo! ]], "LspInstallerMuted" } },
- { { [[ ]], ""}, {[[\]], saber_ticks >= 1 and "LspInstallerVaderSaber" or "LspInstallerMuted"}, {[[ /./=\.\______ ]], "LspInstallerMuted" } },
- { { [[ ## )\/\ ]], "LspInstallerMuted" } },
- { { [[ ||-----w|| ]], "LspInstallerMuted" } },
- { { [[ || || ]], "LspInstallerMuted" } },
- { { [[ ]], "LspInstallerMuted" } },
- { { [[ Cowth Vader (alleged Neovim user) ]], "LspInstallerMuted" } },
- { { [[ ]], "LspInstallerMuted" } },
- }
- -- stylua: ignore end
- end
-)
-
----@param is_current_settings_expanded boolean
----@param vader_saber_ticks number
-local function Help(is_current_settings_expanded, vader_saber_ticks)
- local keymap_tuples = {
- { "Toggle help", HELP_KEYMAP },
- { "Toggle server info", settings.current.ui.keymaps.toggle_server_expand },
- { "Update server", settings.current.ui.keymaps.update_server },
- { "Update all installed servers", settings.current.ui.keymaps.update_all_servers },
- { "Check for new server version", settings.current.ui.keymaps.check_server_version },
- { "Check for new versions (all servers)", settings.current.ui.keymaps.check_outdated_servers },
- { "Uninstall server", settings.current.ui.keymaps.uninstall_server },
- { "Install server", settings.current.ui.keymaps.install_server },
- { "Close window", CLOSE_WINDOW_KEYMAP_1 },
- { "Close window", CLOSE_WINDOW_KEYMAP_2 },
- }
-
- local very_reasonable_cow = create_vader(vader_saber_ticks)
-
- return Ui.Node {
- Ui.EmptyLine(),
- Ui.HlTextNode {
- { { "Installer log: ", "LspInstallerMuted" }, { log.outfile, "" } },
- },
- Ui.EmptyLine(),
- Ui.Table(vim.list_extend(
- {
- {
- { "Keyboard shortcuts", "LspInstallerLabel" },
- },
- },
- _.map(function(keymap_tuple)
- return { { keymap_tuple[1], "LspInstallerMuted" }, { keymap_tuple[2], "LspInstallerHighlighted" } }
- end, keymap_tuples)
- )),
- Ui.EmptyLine(),
- Ui.HlTextNode {
- { { "Problems installing/uninstalling servers", "LspInstallerLabel" } },
- {
- {
- "Make sure you meet the minimum requirements to install servers. For debugging, refer to:",
- "LspInstallerMuted",
- },
- },
- },
- Indent {
- Ui.HlTextNode {
- {
- { ":help nvim-lsp-installer-debugging", "LspInstallerHighlighted" },
- },
- {
- { ":checkhealth nvim-lsp-installer", "LspInstallerHighlighted" },
- },
- },
- },
- Ui.EmptyLine(),
- Ui.HlTextNode {
- { { "Problems with server functionality", "LspInstallerLabel" } },
- {
- {
- "Please refer to each language server's own homepage for further assistance.",
- "LspInstallerMuted",
- },
- },
- },
- Ui.EmptyLine(),
- Ui.HlTextNode {
- { { "Missing a server?", "LspInstallerLabel" } },
- {
- {
- "Create an issue at ",
- "LspInstallerMuted",
- },
- {
- "https://github.com/williamboman/nvim-lsp-installer/issues/new/choose",
- "LspInstallerHighlighted",
- },
- },
- },
- Ui.EmptyLine(),
- Ui.HlTextNode {
- { { "How do I customize server settings?", "LspInstallerLabel" } },
- {
- { "For information on how to customize a server's settings, see ", "LspInstallerMuted" },
- { ":help lspconfig-setup", "LspInstallerHighlighted" },
- },
- },
- Ui.EmptyLine(),
- Ui.HlTextNode {
- {
- {
- ("%s Current settings"):format(is_current_settings_expanded and "↓" or "→"),
- "LspInstallerLabel",
- },
- { " :help nvim-lsp-installer-settings", "LspInstallerHighlighted" },
- },
- },
- Ui.Keybind("<CR>", "TOGGLE_EXPAND_CURRENT_SETTINGS", nil),
- Ui.When(is_current_settings_expanded, function()
- local settings_split_by_newline = vim.split(vim.inspect(settings.current), "\n")
- local current_settings = _.map(function(line)
- return { { line, "LspInstallerMuted" } }
- end, settings_split_by_newline)
- return Ui.HlTextNode(current_settings)
- end),
- Ui.EmptyLine(),
- Ui.HlTextNode(very_reasonable_cow),
- }
-end
-
----@param props {is_showing_help: boolean, help_command_text: string}
-local function Header(props)
- return Ui.CascadingStyleNode({ "CENTERED" }, {
- Ui.HlTextNode {
- {
- { props.is_showing_help and (" " .. props.help_command_text) or "", "LspInstallerHeaderHelp" },
- {
- props.is_showing_help and "nvim-lsp-installer " or " nvim-lsp-installer ",
- props.is_showing_help and "LspInstallerHeaderHelp" or "LspInstallerHeader",
- },
- {
- props.is_showing_help and (" "):rep(#props.help_command_text) or "",
- "",
- },
- },
- {
- { props.is_showing_help and " press " or "press ", "LspInstallerMuted" },
- { "?", props.is_showing_help and "LspInstallerOrange" or "LspInstallerHighlighted" },
- { props.is_showing_help and " for server list" or " for help", "LspInstallerMuted" },
- },
- {
- { "https://github.com/williamboman/nvim-lsp-installer", "Comment" },
- },
- },
- })
-end
-
----@param time number
-local function format_time(time)
- return os.date("%d %b %Y %H:%M", time)
-end
-
----@param outdated_packages OutdatedPackage[]
----@return string
-local function format_new_package_versions(outdated_packages)
- local result = {}
- if #outdated_packages == 1 then
- return outdated_packages[1].latest_version
- end
- for _, outdated_package in ipairs(outdated_packages) do
- result[#result + 1] = ("%s@%s"):format(outdated_package.name, outdated_package.latest_version)
- end
- return table.concat(result, ", ")
-end
-
----@param server ServerState
-local function ServerMetadata(server)
- return Ui.Node(_.list_not_nil(
- _.lazy_when(server.is_installed and server.deprecated, function()
- return Ui.Node(_.list_not_nil(
- Ui.HlTextNode { server.deprecated.message, "Comment" },
- _.lazy_when(server.deprecated.replace_with, function()
- return Ui.Node {
- Ui.HlTextNode {
- {
- { "Replace with: ", "LspInstallerMuted" },
- { server.deprecated.replace_with, "LspInstallerHighlighted" },
- },
- },
- Ui.Keybind("<CR>", "REPLACE_SERVER", { server.name, server.deprecated.replace_with }),
- Ui.EmptyLine(),
- }
- end)
- ))
- end),
- Ui.Table(_.list_not_nil(
- _.lazy_when(server.is_installed, function()
- return {
- { "version", "LspInstallerMuted" },
- server.installed_version_err and {
- "Unable to detect version.",
- "LspInstallerMuted",
- } or { server.installed_version or "Loading...", "" },
- }
- end),
- _.lazy_when(#server.metadata.outdated_packages > 0, function()
- return {
- { "latest version", "LspInstallerGreen" },
- {
- format_new_package_versions(server.metadata.outdated_packages),
- "LspInstallerGreen",
- },
- }
- end),
- _.lazy_when(server.metadata.install_timestamp_seconds, function()
- return {
- { "installed", "LspInstallerMuted" },
- { format_time(server.metadata.install_timestamp_seconds), "" },
- }
- end),
- _.when(not server.is_installed, {
- { "filetypes", "LspInstallerMuted" },
- { server.metadata.filetypes, "" },
- }),
- _.when(server.is_installed, {
- { "install dir", "LspInstallerMuted" },
- { server.metadata.install_dir, "String" },
- }),
- {
- { "homepage", "LspInstallerMuted" },
- server.metadata.homepage and { server.metadata.homepage, "LspInstallerLink" } or {
- "-",
- "LspInstallerMuted",
- },
- }
- )),
- Ui.When(server.schema, function()
- return Ui.Node {
- Ui.EmptyLine(),
- Ui.HlTextNode {
- {
- {
- ("%s Server configuration schema"):format(server.has_expanded_schema and "↓" or "→"),
- "LspInstallerLabel",
- },
- {
- (" (press enter to %s)"):format(server.has_expanded_schema and "collapse" or "expand"),
- "Comment",
- },
- },
- },
- Ui.Keybind("<CR>", "TOGGLE_SERVER_SETTINGS_SCHEMA", { server.name }),
- Ui.When(server.has_expanded_schema, function()
- return Indent {
- Ui.HlTextNode {
- {
- {
- "This is a read-only representation of the settings this server accepts. Note that some settings might not apply to neovim.",
- "LspInstallerMuted",
- },
- },
- {
- { "For information on how to customize these settings, see ", "LspInstallerMuted" },
- { ":help lspconfig-setup", "LspInstallerHighlighted" },
- },
- },
- Ui.EmptyLine(),
- ServerSettingsSchema(server, server.schema),
- }
- end),
- Ui.EmptyLine(),
- }
- end)
- ))
-end
-
----@param packages OutdatedPackage[]
-local function format_outdated_packages(packages)
- return table.concat(
- vim.tbl_map(function(package)
- return ("%s %s -> %s"):format(package.name, package.current_version, package.latest_version)
- end, packages),
- "\n"
- )
-end
-
----@param servers ServerState[]
----@param props ServerGroupProps
-local function InstalledServers(servers, props)
- return Ui.Node(_.map(
- ---@param server ServerState
- function(server)
- local is_expanded = props.expanded_server == server.name
- return Ui.Node {
- Ui.HlTextNode {
- _.list_not_nil(
- { settings.current.ui.icons.server_installed, "LspInstallerGreen" },
- { " " .. server.name .. " ", "" },
- { server.hints, "Comment" },
- _.when(server.deprecated, { " deprecated", "LspInstallerOrange" })
- ),
- },
- Ui.When(
- #server.metadata.outdated_packages > 0,
- Ui.DiagnosticsNode {
- message = ("new version available, press %s to update \n"):format(
- settings.current.ui.keymaps.update_server
- ) .. format_outdated_packages(server.metadata.outdated_packages),
- severity = vim.diagnostic.severity.INFO,
- source = server.name,
- }
- ),
- Ui.Keybind(settings.current.ui.keymaps.toggle_server_expand, "EXPAND_SERVER", { server.name }),
- Ui.Keybind(settings.current.ui.keymaps.update_server, "INSTALL_SERVER", { server.name }),
- Ui.Keybind(settings.current.ui.keymaps.check_server_version, "CHECK_SERVER_VERSION", { server.name }),
- Ui.Keybind(settings.current.ui.keymaps.uninstall_server, "UNINSTALL_SERVER", { server.name }),
- Ui.When(is_expanded, function()
- return Indent {
- ServerMetadata(server),
- }
- end),
- }
- end,
- servers
- ))
-end
-
----@param server ServerState
-local function TailedOutput(server)
- return Ui.HlTextNode(_.map(function(line)
- return { { line, "LspInstallerMuted" } }
- end, server.installer.tailed_output))
-end
-
----@param output string[]
----@return string
-local function get_last_non_empty_line(output)
- for i = #output, 1, -1 do
- local line = output[i]
- if #line > 0 then
- return line
- end
- end
- return ""
-end
-
----@param servers ServerState[]
-local function PendingServers(servers)
- return Ui.Node(_.map(function(_server)
- ---@type ServerState
- local server = _server
- local has_failed = server.installer.has_run or server.uninstaller.has_run
- local note = has_failed and "(failed)" or (server.installer.is_queued and "(queued)" or "(installing)")
- return Ui.Node {
- Ui.HlTextNode {
- _.list_not_nil(
- {
- settings.current.ui.icons.server_pending,
- has_failed and "LspInstallerError" or "LspInstallerOrange",
- },
- { " " .. server.name, server.installer.is_running and "" or "LspInstallerMuted" },
- { " " .. note, "Comment" },
- _.when(not has_failed, {
- (" " .. get_last_non_empty_line(server.installer.tailed_output)),
- "Comment",
- })
- ),
- },
- Ui.Keybind(settings.current.ui.keymaps.install_server, "INSTALL_SERVER", { server.name }),
- Ui.When(has_failed, function()
- return Indent { Indent { TailedOutput(server) } }
- end),
- Ui.When(
- server.uninstaller.error,
- Indent {
- Ui.HlTextNode { server.uninstaller.error, "Comment" },
- }
- ),
- }
- end, servers))
-end
-
----@param servers ServerState[]
----@param props ServerGroupProps
-local function UninstalledServers(servers, props)
- return Ui.Node(_.map(function(_server)
- ---@type ServerState
- local server = _server
- local is_prioritized = props.prioritized_servers[server.name]
- local is_expanded = props.expanded_server == server.name
- return Ui.Node {
- Ui.HlTextNode {
- _.list_not_nil(
- {
- settings.current.ui.icons.server_uninstalled,
- is_prioritized and "LspInstallerHighlighted" or "LspInstallerMuted",
- },
- { " " .. server.name .. " ", "LspInstallerMuted" },
- { server.hints, "Comment" },
- _.when(server.uninstaller.has_run, { " (uninstalled) ", "Comment" }),
- _.when(server.deprecated, { "deprecated ", "LspInstallerOrange" })
- ),
- },
- Ui.Keybind(settings.current.ui.keymaps.toggle_server_expand, "EXPAND_SERVER", { server.name }),
- Ui.Keybind(settings.current.ui.keymaps.install_server, "INSTALL_SERVER", { server.name }),
- Ui.When(is_expanded, function()
- return Indent {
- ServerMetadata(server),
- }
- end),
- }
- end, servers))
-end
-
----@alias ServerGroupProps {title: string, title_diagnostics: table|nil, subtitle: string|nil, hide_when_empty: boolean|nil, servers: ServerState[][], expanded_server: string|nil, renderer: fun(servers: ServerState[], props: ServerGroupProps)}
-
----@param props ServerGroupProps
-local function ServerGroup(props)
- local total_server_count = 0
- local chunks = props.servers
- for i = 1, #chunks do
- local servers = chunks[i]
- total_server_count = total_server_count + #servers
- end
-
- return Ui.When(total_server_count > 0 or not props.hide_when_empty, function()
- return Ui.Node {
- Ui.EmptyLine(),
- ServerGroupHeading {
- title = props.title,
- diagnostics = props.title_diagnostics,
- subtitle = props.subtitle,
- count = total_server_count,
- },
- Indent(_.map(function(servers)
- return props.renderer(servers, props)
- end, props.servers)),
- }
- end)
-end
-
----@param state StatusWinState
-local function Servers(state)
- local grouped_servers = {
- installed = {},
- queued = {},
- session_installed = {},
- uninstall_failed = {},
- installing = {},
- install_failed = {},
- uninstalled_prioritized = {},
- uninstalled = {},
- session_uninstalled = {},
- }
-
- local servers, server_name_order, prioritized_servers, expanded_server =
- state.servers, state.server_name_order, state.prioritized_servers, state.expanded_server
-
- -- giggity
- for _, server_name in ipairs(server_name_order) do
- local server = servers[server_name]
- if server.installer.is_running then
- grouped_servers.installing[#grouped_servers.installing + 1] = server
- elseif server.installer.is_queued then
- grouped_servers.queued[#grouped_servers.queued + 1] = server
- elseif server.uninstaller.has_run then
- if server.uninstaller.error then
- grouped_servers.uninstall_failed[#grouped_servers.uninstall_failed + 1] = server
- else
- grouped_servers.session_uninstalled[#grouped_servers.session_uninstalled + 1] = server
- end
- elseif server.is_installed then
- if server.installer.has_run then
- grouped_servers.session_installed[#grouped_servers.session_installed + 1] = server
- else
- grouped_servers.installed[#grouped_servers.installed + 1] = server
- end
- elseif server.installer.has_run then
- grouped_servers.install_failed[#grouped_servers.install_failed + 1] = server
- else
- if prioritized_servers[server.name] then
- grouped_servers.uninstalled_prioritized[#grouped_servers.uninstalled_prioritized + 1] = server
- else
- grouped_servers.uninstalled[#grouped_servers.uninstalled + 1] = server
- end
- end
- end
-
- return Ui.Node {
- ServerGroup {
- title = "Installed servers",
- title_diagnostics = state.has_outdated_servers and {
- severity = vim.diagnostic.severity.INFO,
- message = ("press %s to update all outdated servers"):format(
- settings.current.ui.keymaps.update_all_servers
- ),
- } or nil,
- subtitle = state.server_version_check_completed_percentage ~= nil and {
- {
- "checking for new versions ",
- "Comment",
- },
- {
- state.server_version_check_completed_percentage .. "%",
- state.server_version_check_completed_percentage == 100 and "LspInstallerVersionCheckLoaderDone"
- or "LspInstallerVersionCheckLoader",
- },
- {
- string.rep(" ", math.floor(state.server_version_check_completed_percentage / 5)),
- state.server_version_check_completed_percentage == 100 and "LspInstallerVersionCheckLoaderDone"
- or "LspInstallerVersionCheckLoader",
- },
- },
- renderer = InstalledServers,
- servers = { grouped_servers.session_installed, grouped_servers.installed },
- expanded_server = expanded_server,
- },
- ServerGroup {
- title = "Pending servers",
- hide_when_empty = true,
- renderer = PendingServers,
- servers = {
- grouped_servers.installing,
- grouped_servers.queued,
- grouped_servers.install_failed,
- grouped_servers.uninstall_failed,
- },
- expanded_server = expanded_server,
- },
- ServerGroup {
- title = "Available servers",
- renderer = UninstalledServers,
- servers = {
- grouped_servers.session_uninstalled,
- grouped_servers.uninstalled_prioritized,
- grouped_servers.uninstalled,
- },
- expanded_server = expanded_server,
- prioritized_servers = prioritized_servers,
- },
- }
-end
-
----@param server Server
-local function create_initial_server_state(server)
- ---@class ServerState
- local server_state = {
- name = server.name,
- is_installed = server:is_installed(),
- deprecated = server.deprecated,
- hints = tostring(ServerHints.new(server)),
- expanded_schema_properties = {},
- has_expanded_schema = false,
- installed_version = nil, -- lazy
- installed_version_err = nil, -- lazy
- ---@type table
- schema = nil, -- lazy
- metadata = {
- homepage = server.homepage,
- ---@type number
- install_timestamp_seconds = nil, -- lazy
- install_dir = vim.fn.fnamemodify(server.root_dir, ":~"),
- filetypes = table.concat(server:get_supported_filetypes(), ", "),
- ---@type OutdatedPackage[]
- outdated_packages = {},
- },
- installer = {
- is_queued = false,
- is_running = false,
- has_run = false,
- tailed_output = { "" },
- },
- uninstaller = {
- has_run = false,
- error = nil,
- },
- }
- return server_state
-end
-
-local function normalize_chunks_line_endings(chunk, dest)
- local chunk_lines = vim.split(chunk, "\n")
- dest[#dest] = dest[#dest] .. chunk_lines[1]
- for i = 2, #chunk_lines do
- dest[#dest + 1] = chunk_lines[i]
- end
-end
-
-local function init(all_servers)
- local filetype_map = require "nvim-lsp-installer._generated.filetype_map"
- local window = display.new_view_only_win "LSP servers"
-
- log.trace "Initializing status window"
-
- window.view(
- --- @param state StatusWinState
- function(state)
- return Indent {
- Ui.Keybind(HELP_KEYMAP, "TOGGLE_HELP", nil, true),
- Ui.Keybind(CLOSE_WINDOW_KEYMAP_1, "CLOSE_WINDOW", nil, true),
- Ui.Keybind(CLOSE_WINDOW_KEYMAP_2, "CLOSE_WINDOW", nil, true),
- Ui.Keybind(settings.current.ui.keymaps.check_outdated_servers, "CHECK_OUTDATED_SERVERS", nil, true),
- Ui.Keybind(settings.current.ui.keymaps.update_all_servers, "UPDATE_ALL_SERVERS", nil, true),
- Header {
- is_showing_help = state.is_showing_help,
- help_command_text = state.help_command_text,
- },
- Ui.When(state.is_showing_help, function()
- return Help(state.is_current_settings_expanded, state.vader_saber_ticks)
- end),
- Ui.When(not state.is_showing_help, function()
- return Servers(state)
- end),
- }
- end
- )
-
- ---@type table<string, ServerState>
- local servers = {}
- ---@type string[]
- local server_name_order = {}
- for i = 1, #all_servers do
- local server = all_servers[i]
- servers[server.name] = create_initial_server_state(server)
- server_name_order[#server_name_order + 1] = server.name
- end
-
- table.sort(server_name_order)
-
- ---@class StatusWinState
- ---@field prioritized_servers string[]
- local initial_state = {
- server_name_order = server_name_order,
- servers = servers,
- server_version_check_completed_percentage = nil,
- has_outdated_servers = false,
- is_showing_help = false,
- is_current_settings_expanded = false,
- prioritized_servers = {},
- expanded_server = nil,
- help_command_text = "", -- for "animating" the ":help" text when toggling the help window
- vader_saber_ticks = 0, -- for "animating" the cowthvader lightsaber
- }
-
- local mutate_state_generic, get_state_generic = window.init(initial_state)
- -- Generics don't really work with higher-order functions so we cast it here.
- ---@type fun(mutate_fn: fun(current_state: StatusWinState))
- local mutate_state = mutate_state_generic
- ---@type fun(): StatusWinState
- local get_state = get_state_generic
-
- local async_populate_server_metadata = a.scope(function(server_name)
- a.scheduler()
- local ok, server = lsp_servers.get_server(server_name)
- if not ok then
- return log.warn("Unable to get server when populating metadata.", server_name)
- end
- local fstat_ok, fstat = pcall(fs.async.fstat, server.root_dir)
- mutate_state(function(state)
- if fstat_ok then
- state.servers[server.name].metadata.install_timestamp_seconds = fstat.mtime.sec
- end
- state.servers[server.name].schema = server:get_settings_schema()
- end)
- local version = version_check.check_server_version(server)
- mutate_state(function(state)
- if version:is_success() then
- state.servers[server.name].installed_version = version:get_or_nil()
- state.servers[server.name].installed_version_err = nil
- else
- state.servers[server.name].installed_version_err = true
- end
- end)
- end)
-
- ---@param server_name string
- local function expand_server(server_name)
- mutate_state(function(state)
- local should_expand = state.expanded_server ~= server_name
- state.expanded_server = should_expand and server_name or nil
- if should_expand then
- async_populate_server_metadata(server_name)
- end
- end)
- end
-
- ---@param server Server
- ---@param requested_version string|nil
- ---@param on_complete fun()
- local function start_install(server, requested_version, on_complete)
- mutate_state(function(state)
- state.servers[server.name].installer.is_queued = false
- state.servers[server.name].installer.is_running = true
- end)
-
- log.fmt_debug("Starting install server_name=%s, requested_version=%s", server.name, requested_version or "")
-
- server:install_attached({
- requested_server_version = requested_version,
- stdio_sink = {
- stdout = function(chunk)
- mutate_state(function(state)
- local tailed_output = state.servers[server.name].installer.tailed_output
- normalize_chunks_line_endings(chunk, tailed_output)
- end)
- end,
- stderr = function(chunk)
- mutate_state(function(state)
- local tailed_output = state.servers[server.name].installer.tailed_output
- normalize_chunks_line_endings(chunk, tailed_output)
- end)
- end,
- },
- }, function(success)
- log.fmt_info("Installation completed server_name=%s, success=%s", server.name, success)
- mutate_state(function(state)
- if success then
- -- release stdout/err output table.. hopefully ¯\_(ツ)_/¯
- state.servers[server.name].installer.tailed_output = { "" }
- end
- state.servers[server.name].is_installed = success
- state.servers[server.name].installer.is_running = false
- state.servers[server.name].installer.has_run = true
- if not state.expanded_server then
- -- Only automatically expand the server upon installation if none is already expanded, for UX reasons
- expand_server(server.name)
- elseif state.expanded_server == server.name then
- -- Refresh server metadata
- async_populate_server_metadata(server.name)
- end
- end)
- on_complete()
- end)
- end
-
- -- We have a queue because installers have a tendency to hog resources.
- local job_pool = JobExecutionPool:new {
- size = settings.current.max_concurrent_installers,
- }
- ---@param server Server
- ---@param version string|nil
- local function install_server(server, version)
- log.fmt_debug("Queuing server=%s, version=%s for installation", server.name, version or "")
- local server_state = get_state().servers[server.name]
- if server_state and (server_state.installer.is_running or server_state.installer.is_queued) then
- log.debug("Installer is already queued/running", server.name)
- return
- end
- mutate_state(function(state)
- -- reset state
- state.servers[server.name] = create_initial_server_state(server)
- state.servers[server.name].installer.is_queued = true
- end)
- job_pool:supply(function(cb)
- start_install(server, version, cb)
- end)
- end
-
- ---@param server Server
- local function uninstall_server(server)
- local server_state = get_state().servers[server.name]
- if server_state and (server_state.installer.is_running or server_state.installer.is_queued) then
- log.debug("Installer is already queued/running", server.name)
- return
- end
-
- local is_uninstalled, err = pcall(server.uninstall, server)
- mutate_state(function(state)
- -- reset state
- state.servers[server.name] = create_initial_server_state(server)
- if is_uninstalled then
- state.servers[server.name].is_installed = false
- end
- state.servers[server.name].uninstaller.has_run = true
- state.servers[server.name].uninstaller.error = err
- end)
- end
-
- local function mark_all_servers_uninstalled()
- mutate_state(function(state)
- for _, server_name in ipairs(lsp_servers.get_available_server_names()) do
- if state.servers[server_name].is_installed then
- state.servers[server_name].is_installed = false
- state.servers[server_name].uninstaller.has_run = true
- end
- end
- end)
- end
-
- local make_animation = function(opts)
- local animation_fn = opts[1]
- local is_animating = false
- local start_animation = function()
- if is_animating then
- return
- end
- local tick, start
-
- tick = function(current_tick)
- animation_fn(current_tick)
- if current_tick < opts.end_tick then
- vim.defer_fn(function()
- tick(current_tick + 1)
- end, opts.delay_ms)
- else
- is_animating = false
- if opts.iteration_delay_ms then
- start(opts.iteration_delay_ms)
- end
- end
- end
-
- start = function(delay_ms)
- is_animating = true
- if delay_ms then
- vim.defer_fn(function()
- tick(opts.start_tick)
- end, delay_ms)
- else
- tick(opts.start_tick)
- end
- end
-
- start(opts.start_delay_ms)
-
- local function cancel()
- is_animating = false
- end
-
- return cancel
- end
-
- return start_animation
- end
-
- local start_help_command_animation
- do
- local help_command = ":help "
- local help_command_len = #help_command
- start_help_command_animation = make_animation {
- function(tick)
- mutate_state(function(state)
- state.help_command_text = help_command:sub(help_command_len - tick, help_command_len)
- end)
- end,
- start_tick = 0,
- end_tick = help_command_len,
- delay_ms = 80,
- }
- end
-
- local start_vader_saber_animation = make_animation {
- function(tick)
- mutate_state(function(state)
- state.vader_saber_ticks = tick
- end)
- end,
- start_tick = 0,
- end_tick = 3,
- delay_ms = 350,
- iteration_delay_ms = 10000,
- start_delay_ms = 1000,
- }
-
- local function close()
- if window then
- window.close()
- end
- end
-
- local has_opened = false
-
- local function identify_outdated_servers(servers)
- -- Sort servers the same way as in the UI, gives a more structured impression
- table.sort(servers, function(a, b)
- return a.name < b.name
- end)
- if #servers > 0 then
- mutate_state(function(state)
- state.has_outdated_servers = false
- state.server_version_check_completed_percentage = 0
- end)
- end
- local has_outdated_servers = false
- outdated_servers.identify_outdated_servers(servers, function(check_result, progress)
- mutate_state(function(state)
- local completed_percentage = progress.completed / progress.total
- state.server_version_check_completed_percentage = math.floor(completed_percentage * 100)
- if completed_percentage == 1 then
- vim.defer_fn(function()
- mutate_state(function(state)
- state.has_outdated_servers = has_outdated_servers
- state.server_version_check_completed_percentage = nil
- end)
- end, 700)
- end
-
- if check_result.success and check_result:has_outdated_packages() then
- has_outdated_servers = true
- state.servers[check_result.server.name].metadata.outdated_packages = check_result.outdated_packages
- end
- end)
- end)
- end
-
- local function open()
- local open_filetypes = {}
- for _, open_bufnr in ipairs(vim.api.nvim_list_bufs()) do
- table.insert(open_filetypes, vim.api.nvim_buf_get_option(open_bufnr, "filetype"))
- end
-
- local prioritized_servers = {}
- for _, filetype in ipairs(open_filetypes) do
- if filetype_map[filetype] then
- vim.list_extend(prioritized_servers, filetype_map[filetype])
- end
- end
-
- mutate_state(function(state)
- state.is_showing_help = false
- state.prioritized_servers = _.set_of(prioritized_servers)
- end)
-
- if not has_opened and settings.current.ui.check_outdated_servers_on_open then
- -- Only do this automatically once - when opening the window the first time
- vim.defer_fn(function()
- identify_outdated_servers(lsp_servers.get_installed_servers())
- end, 100)
- end
-
- window.open {
- border = settings.current.ui.border,
- highlight_groups = {
- "hi def LspInstallerHeader gui=bold guifg=#222222 guibg=#DCA561",
- "hi def LspInstallerHeaderHelp gui=bold guifg=#222222 guibg=#56B6C2",
- "hi def LspInstallerServerExpanded gui=italic",
- "hi def LspInstallerHeading gui=bold",
- "hi def LspInstallerGreen guifg=#a3be8c",
- "hi def LspInstallerVaderSaber guifg=#f44747 gui=bold",
- "hi def LspInstallerOrange ctermfg=222 guifg=#DCA561",
- "hi def LspInstallerMuted guifg=#888888 ctermfg=144",
- "hi def LspInstallerLabel gui=bold",
- "hi def LspInstallerError ctermfg=203 guifg=#f44747",
- "hi def LspInstallerHighlighted guifg=#56B6C2",
- "hi def LspInstallerVersionCheckLoader gui=bold guifg=#222222 guibg=#888888",
- "hi def LspInstallerVersionCheckLoaderDone gui=bold guifg=#222222 guibg=#a3be8c",
- "hi def link LspInstallerLink LspInstallerHighlighted",
- },
- effects = {
- ["TOGGLE_HELP"] = function()
- if not get_state().is_showing_help then
- start_help_command_animation()
- start_vader_saber_animation()
- window.set_cursor { 1, 1 }
- end
- mutate_state(function(state)
- state.is_showing_help = not state.is_showing_help
- end)
- end,
- ["CLOSE_WINDOW"] = function()
- close()
- end,
- ["CHECK_OUTDATED_SERVERS"] = function()
- vim.schedule(function()
- identify_outdated_servers(lsp_servers.get_installed_servers())
- end)
- end,
- ["CHECK_SERVER_VERSION"] = function(e)
- local server_name = e.payload[1]
- local ok, server = lsp_servers.get_server(server_name)
- if ok then
- identify_outdated_servers { server }
- end
- end,
- ["TOGGLE_EXPAND_CURRENT_SETTINGS"] = function()
- mutate_state(function(state)
- state.is_current_settings_expanded = not state.is_current_settings_expanded
- end)
- end,
- ["EXPAND_SERVER"] = function(e)
- local server_name = e.payload[1]
- expand_server(server_name)
- end,
- ["TOGGLE_SERVER_SETTINGS_SCHEMA"] = function(e)
- local server_name = e.payload[1]
- mutate_state(function(state)
- state.servers[server_name].has_expanded_schema =
- not state.servers[server_name].has_expanded_schema
- end)
- end,
- ["TOGGLE_SERVER_SCHEMA_SETTING"] = function(e)
- local server_name = e.payload.name
- local key = e.payload.key
- mutate_state(function(state)
- state.servers[server_name].expanded_schema_properties[key] =
- not state.servers[server_name].expanded_schema_properties[key]
- end)
- end,
- ["INSTALL_SERVER"] = function(e)
- mutate_state(function(state)
- state.has_outdated_servers = false
- end)
- local server_name = e.payload[1]
- local ok, server = lsp_servers.get_server(server_name)
- if ok then
- install_server(server, nil)
- end
- end,
- ["UPDATE_ALL_SERVERS"] = function()
- mutate_state(function(state)
- state.has_outdated_servers = false
- end)
- local installed_servers = lsp_servers.get_installed_servers()
- local state = get_state()
- local outdated_servers = vim.tbl_filter(function(server)
- return #state.servers[server.name].metadata.outdated_packages > 0
- end, installed_servers)
- -- Install servers that are identified as outdated, otherwise update all installed servers.
- local servers_to_update = #outdated_servers > 0 and outdated_servers or installed_servers
- for _, server in ipairs(servers_to_update) do
- install_server(server, nil)
- end
- end,
- ["UNINSTALL_SERVER"] = function(e)
- mutate_state(function(state)
- state.has_outdated_servers = false
- end)
- local server_name = e.payload[1]
- local ok, server = lsp_servers.get_server(server_name)
- if ok then
- uninstall_server(server)
- end
- end,
- ["REPLACE_SERVER"] = function(e)
- mutate_state(function(state)
- state.has_outdated_servers = false
- end)
- local old_server_name, new_server_name = e.payload[1], e.payload[2]
- local old_ok, old_server = lsp_servers.get_server(old_server_name)
- local new_ok, new_server = lsp_servers.get_server(new_server_name)
- if old_ok and new_ok then
- uninstall_server(old_server)
- install_server(new_server)
- end
- end,
- },
- }
- has_opened = true
- end
-
- return {
- open = open,
- close = close,
- install_server = install_server,
- uninstall_server = uninstall_server,
- mark_all_servers_uninstalled = mark_all_servers_uninstalled,
- }
-end
-
-local win
-return function()
- if win then
- return win
- end
- win = init(lsp_servers.get_available_servers())
- return win
-end
diff --git a/lua/nvim-lsp-installer/ui/server_hints.lua b/lua/nvim-lsp-installer/ui/server_hints.lua
deleted file mode 100644
index daf5e9b6..00000000
--- a/lua/nvim-lsp-installer/ui/server_hints.lua
+++ /dev/null
@@ -1,41 +0,0 @@
----@class ServerHints
----@field server Server
-local ServerHints = {}
-ServerHints.__index = ServerHints
-
-function ServerHints.new(server)
- return setmetatable({ server = server }, ServerHints)
-end
-
----@param language string
----@return boolean
-function ServerHints:is_language_equal(language)
- local match_start, match_end = self.server.name:find(language, 1, true)
- -- This is somewhat... arbitrary
- return match_start ~= nil
- and (match_end - match_start) >= 2 -- the match need to be at least 2 in length
- -- match needs to start in the beginning - if it's not, then the total string lengths cannot differ too much
- and (match_start == 1 or (match_start < 3 and (math.abs(#self.server.name - #language) < 4)))
-end
-
-function ServerHints:get_hints()
- local hints = {}
- if self.server.languages then
- for _, language in ipairs(self.server.languages) do
- if not self:is_language_equal(language) then
- hints[#hints + 1] = language
- end
- end
- end
- return hints
-end
-
-function ServerHints:__tostring()
- local hints = self:get_hints()
- if #hints == 0 then
- return ""
- end
- return "(" .. table.concat(hints, ", ") .. ")"
-end
-
-return ServerHints