svelte: isolate prettier formatter wiring and fix plugin runtime packaging

This commit is contained in:
suiiii 2026-04-12 21:06:23 +02:00
commit a6d2346e34
No known key found for this signature in database
GPG key ID: 2F1ACB1232E35B05
3 changed files with 43 additions and 9 deletions

View file

@ -390,4 +390,10 @@ https://github.com/gorbit99/codewindow.nvim
- Add razor support for `roslyn_ls` and `csharp_ls`
[suiiii](https://github.com/suicide)
- Fix `languages.svelte` formatting to use an isolated Conform formatter id and
a wrapped Prettier package, so enabling Svelte support no longer overrides
TypeScript formatting or breaks Svelte plugin resolution at runtime.
<!-- vim: set textwidth=80: -->

View file

@ -1,6 +1,8 @@
{
buildNpmPackage,
fetchFromGitHub,
makeWrapper,
nodejs,
pins,
}: let
pin = pins.prettier-plugin-svelte;
@ -9,6 +11,8 @@ in
pname = "prettier-plugin-svelte";
version = pin.version or pin.revision;
meta.mainProgram = "prettier";
src = fetchFromGitHub {
inherit (pin.repository) owner repo;
rev = finalAttrs.version;
@ -16,4 +20,21 @@ in
};
npmDepsHash = "sha256-XVyLW0XDCvZCZxu8g1fP7fRfeU3Hz81o5FCi/i4BKQw=";
nativeBuildInputs = [makeWrapper];
installPhase = ''
runHook preInstall
mkdir -p "$out/bin" "$out/lib"
cp -r node_modules "$out/lib/"
mkdir -p "$out/lib/node_modules/prettier-plugin-svelte"
cp -r browser.js index.d.ts package.json plugin.js plugin.js.map "$out/lib/node_modules/prettier-plugin-svelte/"
makeWrapper "${nodejs}/bin/node" "$out/bin/prettier" \
--add-flags "$out/lib/node_modules/prettier/bin/prettier.cjs" \
--set NODE_PATH "$out/lib/node_modules"
runHook postInstall
'';
})

View file

@ -8,7 +8,7 @@
inherit (builtins) attrNames;
inherit (lib.options) mkEnableOption mkOption literalExpression;
inherit (lib.modules) mkIf mkMerge;
inherit (lib.meta) getExe;
inherit (lib.meta) getExe getExe';
inherit (lib.types) enum coercedTo;
inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf;
inherit (lib.nvim.attrsets) mapListToAttrs;
@ -16,6 +16,14 @@
cfg = config.vim.languages.svelte;
formatterNames = {
prettier = "prettier_svelte";
biome = "biome";
};
mapFormatterName = name: formatterNames.${name};
configuredFormatters = map mapFormatterName cfg.format.type;
defaultServers = ["svelte"];
servers = {
svelte = {
@ -56,13 +64,12 @@
defaultFormat = ["prettier"];
formats = let
prettierPlugin = inputs.self.packages.${pkgs.stdenv.system}.prettier-plugin-svelte;
prettierPluginPath = "${prettierPlugin}/lib/node_modules/prettier-plugin-svelte/plugin.js";
prettierWithSvelte = inputs.self.packages.${pkgs.stdenv.system}.prettier-plugin-svelte;
in {
prettier = {
command = getExe pkgs.prettier;
prettier_svelte = {
command = getExe' prettierWithSvelte "prettier";
options.ft_parsers.svelte = "svelte";
prepend_args = ["--plugin=${prettierPluginPath}"];
prepend_args = ["--plugin=${prettierWithSvelte}/lib/node_modules/prettier-plugin-svelte/plugin.js"];
};
biome = {
@ -98,7 +105,7 @@
lib.warn
"vim.languages.svelte.format.type: prettierd is deprecated, use prettier instead"
"prettier")
(enum (attrNames formats)));
(enum (attrNames formatterNames)));
in {
options.vim.languages.svelte = {
enable = mkEnableOption "Svelte language support";
@ -179,13 +186,13 @@ in {
vim.formatter.conform-nvim = {
enable = true;
setupOpts = {
formatters_by_ft.svelte = cfg.format.type;
formatters_by_ft.svelte = configuredFormatters;
formatters =
mapListToAttrs (name: {
inherit name;
value = formats.${name};
})
cfg.format.type;
configuredFormatters;
};
};
})