diff --git a/modules/dependencies.nix b/modules/dependencies.nix index d7602c1e..455f6366 100644 --- a/modules/dependencies.nix +++ b/modules/dependencies.nix @@ -30,6 +30,16 @@ let // lib.optionalAttrs (literalExpressionType.check properties.example) { inherit (properties) example; }; + + packageFallback = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + When enabled, the ${name} package will be added to the end of the `PATH` _(suffix)_ instead of the beginning _(prefix)_. + + This can be useful if you want local versions (e.g. from a devshell) to override the Nixvim version. + ''; + }; }; # Motivation: @@ -49,6 +59,17 @@ let merge = lib.options.mergeEqualOption; check = v: v ? _type && (v._type == "literalExpression" || v._type == "literalMD"); }; + + enabledPackages = lib.pipe cfg [ + builtins.attrValues + (lib.filter (p: p.enable)) + (lib.partition (p: p.packageFallback)) + (lib.mapAttrs (_: map (p: p.package))) + (parts: { + prefix = parts.wrong; + suffix = parts.right; + }) + ]; in { options = { @@ -94,11 +115,8 @@ in }; config = { - extraPackages = lib.pipe cfg [ - builtins.attrValues - (builtins.filter (p: p.enable)) - (map (p: p.package)) - ]; + extraPackages = enabledPackages.prefix; + extraPackagesAfter = enabledPackages.suffix; __depPackages = { bat.default = "bat"; diff --git a/tests/test-sources/modules/dependencies.nix b/tests/test-sources/modules/dependencies.nix index 76e0da2d..3c731c40 100644 --- a/tests/test-sources/modules/dependencies.nix +++ b/tests/test-sources/modules/dependencies.nix @@ -70,6 +70,56 @@ in ]; }; + package-fallback-false = + { + lib, + pkgs, + config, + ... + }: + { + dependencies.git = { + enable = true; + packageFallback = false; + }; + + assertions = [ + { + assertion = lib.elem pkgs.git config.extraPackages; + message = "Expected git to be in extraPackages."; + } + { + assertion = !lib.elem pkgs.git config.extraPackagesAfter; + message = "Expected git not to be in extraPackagesAfter."; + } + ]; + }; + + package-fallback-true = + { + lib, + pkgs, + config, + ... + }: + { + dependencies.git = { + enable = true; + packageFallback = true; + }; + + assertions = [ + { + assertion = !lib.elem pkgs.git config.extraPackages; + message = "Expected git not to be in extraPackages."; + } + { + assertion = lib.elem pkgs.git config.extraPackagesAfter; + message = "Expected git to be in extraPackagesAfter."; + } + ]; + }; + # Integration test for `lib.nixvim.deprecation.mkRemovedPackageOptionModule` removed-package-options = {