mirror of
https://github.com/NotAShelf/neovim-flake.git
synced 2024-12-23 22:19:49 +01:00
a452a0b0e7
mkEnableOption already adds the phrase "Whether to enable ..." to the beginning of the option description, such that the string argument should only be "thing to be enabled"
165 lines
4.6 KiB
Nix
165 lines
4.6 KiB
Nix
{
|
|
pkgs,
|
|
config,
|
|
lib,
|
|
...
|
|
}:
|
|
with lib;
|
|
with builtins; let
|
|
cfg = config.vim.languages.ts;
|
|
|
|
defaultServer = "tsserver";
|
|
servers = {
|
|
tsserver = {
|
|
package = pkgs.nodePackages.typescript-language-server;
|
|
lspConfig = ''
|
|
lspconfig.tsserver.setup {
|
|
capabilities = capabilities;
|
|
on_attach = attach_keymaps,
|
|
cmd = ${
|
|
if isList cfg.lsp.package
|
|
then nvim.lua.expToLua cfg.lsp.package
|
|
else ''{"${cfg.lsp.package}/bin/typescript-language-server", "--stdio"}''
|
|
}
|
|
}
|
|
'';
|
|
};
|
|
denols = {
|
|
package = pkgs.deno;
|
|
lspConfig = ''
|
|
vim.g.markdown_fenced_languages = { "ts=typescript" }
|
|
lspconfig.denols.setup {
|
|
capabilities = capabilities;
|
|
on_attach = attach_keymaps,
|
|
cmd = ${
|
|
if isList cfg.lsp.package
|
|
then nvim.lua.expToLua cfg.lsp.package
|
|
else ''{"${cfg.lsp.package}/bin/deno", "lsp"}''
|
|
}
|
|
}
|
|
'';
|
|
};
|
|
};
|
|
|
|
# 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",
|
|
})
|
|
)
|
|
'';
|
|
};
|
|
prettierd = {
|
|
package = pkgs.prettierd;
|
|
nullConfig = ''
|
|
table.insert(
|
|
ls_sources,
|
|
null_ls.builtins.formatting.prettier.with({
|
|
command = "${cfg.format.package}/bin/prettierd",
|
|
})
|
|
)
|
|
'';
|
|
};
|
|
};
|
|
|
|
# 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.ts = {
|
|
enable = mkEnableOption "Typescript/Javascript language support";
|
|
|
|
treesitter = {
|
|
enable = mkEnableOption "Typescript/Javascript treesitter" // {default = config.vim.languages.enableTreesitter;};
|
|
tsPackage = nvim.types.mkGrammarOption pkgs "tsx";
|
|
jsPackage = nvim.types.mkGrammarOption pkgs "javascript";
|
|
};
|
|
|
|
lsp = {
|
|
enable = mkEnableOption "Typescript/Javascript LSP support" // {default = config.vim.languages.enableLSP;};
|
|
|
|
server = mkOption {
|
|
description = "Typescript/Javascript LSP server to use";
|
|
type = with types; enum (attrNames servers);
|
|
default = defaultServer;
|
|
};
|
|
|
|
package = mkOption {
|
|
description = "Typescript/Javascript LSP server package, or the command to run as a list of strings";
|
|
example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]'';
|
|
type = with types; either package (listOf str);
|
|
default = servers.${cfg.lsp.server}.package;
|
|
};
|
|
};
|
|
|
|
format = {
|
|
enable = mkEnableOption "Typescript/Javascript formatting" // {default = config.vim.languages.enableFormat;};
|
|
|
|
type = mkOption {
|
|
description = "Typescript/Javascript formatter to use";
|
|
type = with types; enum (attrNames formats);
|
|
default = defaultFormat;
|
|
};
|
|
|
|
package = mkOption {
|
|
description = "Typescript/Javascript formatter package";
|
|
type = types.package;
|
|
default = formats.${cfg.format.type}.package;
|
|
};
|
|
};
|
|
|
|
extraDiagnostics = {
|
|
enable = mkEnableOption "extra Typescript/Javascript diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;};
|
|
|
|
types = lib.nvim.types.diagnostics {
|
|
langDesc = "Typescript/Javascript";
|
|
inherit diagnostics;
|
|
inherit defaultDiagnostics;
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable (mkMerge [
|
|
(mkIf cfg.treesitter.enable {
|
|
vim.treesitter.enable = true;
|
|
vim.treesitter.grammars = [cfg.treesitter.tsPackage cfg.treesitter.jsPackage];
|
|
})
|
|
|
|
(mkIf cfg.lsp.enable {
|
|
vim.lsp.lspconfig.enable = true;
|
|
vim.lsp.lspconfig.sources.ts-lsp = servers.${cfg.lsp.server}.lspConfig;
|
|
})
|
|
|
|
(mkIf cfg.format.enable {
|
|
vim.lsp.null-ls.enable = true;
|
|
vim.lsp.null-ls.sources.ts-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 = "ts";
|
|
config = cfg.extraDiagnostics.types;
|
|
inherit diagnostics;
|
|
};
|
|
})
|
|
]);
|
|
}
|