From f7bbfe3e3a17438916867c2a77de5226cc1f39e9 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Sat, 3 Jun 2023 17:18:26 +0300 Subject: [PATCH] feature: svelte lsp and diagnostics --- extra.nix | 1 + lib/types/plugins.nix | 3 + modules/languages/default.nix | 1 + modules/languages/svelte.nix | 144 ++++++++++++++++++++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 modules/languages/svelte.nix diff --git a/extra.nix b/extra.nix index 550ae28..64ac3f1 100644 --- a/extra.nix +++ b/extra.nix @@ -54,6 +54,7 @@ inputs: let crates.enable = true; }; ts.enable = isMaximal; + svelte.enable = isMaximal; go.enable = isMaximal; zig.enable = isMaximal; python.enable = isMaximal; diff --git a/lib/types/plugins.nix b/lib/types/plugins.nix index f99394f..0d31aab 100644 --- a/lib/types/plugins.nix +++ b/lib/types/plugins.nix @@ -81,6 +81,9 @@ with lib; let "project-nvim" "elixir-ls" "elixir-tools" + "vim-svelte" + "vim-javascript" + "vim-html" ]; # You can either use the name of the plugin or a package. pluginsType = with types; diff --git a/modules/languages/default.nix b/modules/languages/default.nix index 75d08ab..0b1ac28 100644 --- a/modules/languages/default.nix +++ b/modules/languages/default.nix @@ -22,6 +22,7 @@ in { ./ts.nix ./zig.nix ./html.nix + ./svelte.nix ]; options.vim.languages = { diff --git a/modules/languages/svelte.nix b/modules/languages/svelte.nix new file mode 100644 index 0000000..31aaf6d --- /dev/null +++ b/modules/languages/svelte.nix @@ -0,0 +1,144 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; +with builtins; let + cfg = config.vim.languages.svelte; + + defaultServer = "svelte"; + servers = { + svelte = { + package = pkgs.nodePackages.svelte-language-server; + lspConfig = '' + lspconfig.svelte.setup { + capabilities = capabilities; + on_attach = attach_keymaps, + cmd = { "${cfg.lsp.package}/bin/svelteserver", "--stdio" } + } + ''; + }; + }; + + # TODO: specify packages + defaultFormat = "prettier"; + formats = { + prettier = { + package = pkgs.nodePackages.prettier; + nullConfig = '' + table.insert( + ls_sources, + null_ls.builtins.formatting.prettier.with({ + command = "${cfg.format.package}/bin/prettier", + }) + ) + ''; + }; + }; + + # TODO: specify packages + defaultDiagnostics = ["eslint_d"]; + diagnostics = { + eslint_d = { + package = pkgs.nodePackages.eslint_d; + nullConfig = pkg: '' + table.insert( + ls_sources, + null_ls.builtins.diagnostics.eslint_d.with({ + command = "${lib.getExe pkg}", + }) + ) + ''; + }; + }; +in { + options.vim.languages.svelte = { + enable = mkEnableOption "Svelte language support"; + + treesitter = { + enable = mkOption { + description = "Enable Svelte treesitter"; + type = types.bool; + default = config.vim.languages.enableTreesitter; + }; + sveltePackage = nvim.types.mkGrammarOption pkgs "svelte"; + }; + + lsp = { + enable = mkOption { + description = "Enable Svelte LSP support"; + type = types.bool; + default = config.vim.languages.enableLSP; + }; + server = mkOption { + description = "Svelte LSP server to use"; + type = with types; enum (attrNames servers); + default = defaultServer; + }; + package = mkOption { + description = "Svelte LSP server package"; + type = types.package; + default = servers.${cfg.lsp.server}.package; + }; + }; + + format = { + enable = mkOption { + description = "Enable Svelte formatting"; + type = types.bool; + default = config.vim.languages.enableFormat; + }; + type = mkOption { + description = "Svelte formatter to use"; + type = with types; enum (attrNames formats); + default = defaultFormat; + }; + package = mkOption { + description = "Svelte formatter package"; + type = types.package; + default = formats.${cfg.format.type}.package; + }; + }; + + extraDiagnostics = { + enable = mkOption { + description = "Enable extra Svelte diagnostics"; + type = types.bool; + default = config.vim.languages.enableExtraDiagnostics; + }; + types = lib.nvim.types.diagnostics { + langDesc = "Svelte"; + inherit diagnostics; + inherit defaultDiagnostics; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.sveltePackage]; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.lspconfig.enable = true; + vim.lsp.lspconfig.sources.svelte-lsp = servers.${cfg.lsp.server}.lspConfig; + }) + + (mkIf cfg.format.enable { + vim.lsp.null-ls.enable = true; + vim.lsp.null-ls.sources.svelte-format = formats.${cfg.format.type}.nullConfig; + }) + + (mkIf cfg.extraDiagnostics.enable { + vim.lsp.null-ls.enable = true; + vim.lsp.null-ls.sources = lib.nvim.languages.diagnosticsToLua { + lang = "svelte"; + config = cfg.extraDiagnostics.types; + inherit diagnostics; + }; + }) + ]); +}