From b437169e50a7af3138a761a5f0e15ed839d5a016 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Mon, 4 May 2026 13:42:13 +0200 Subject: [PATCH] fix(inputs'): do not unnecessarily evaluate formatters This compromises the ability to `inputs'?formatter`, but that seems like a particularly rare use case. Instead, we treat `inputs'` as another "programmatic" as opposed to "polished" interfaces, similar to the `config` vs flake attributes distinction. The programmatic interfaces always prioritize laziness whereas the polished interfaces may choose to omit known-missing things, to a reasonable degree. --- dev/tests/nix-unit.nix | 25 +++++++++++++++++++++++++ modules/formatter.nix | 7 +++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/dev/tests/nix-unit.nix b/dev/tests/nix-unit.nix index 25d9971..4dec2eb 100644 --- a/dev/tests/nix-unit.nix +++ b/dev/tests/nix-unit.nix @@ -567,6 +567,31 @@ in }; }; + perInput = { + "test: inputs' does not evaluate input flake formatter" = + let + inputFlake = { + _type = "flake"; + outPath = "/fake"; + formatter = throw "must not evaluate input's formatter"; + packages.a.hello = pkg "a" "hello"; + }; + self = { _type = "flake"; outPath = "/test"; inputs = { inherit self; dep = inputFlake; }; }; + result = mkFlake + { inputs = self.inputs; } + { + systems = [ "a" ]; + perSystem = { inputs', ... }: { + packages.default = inputs'.dep.packages.hello; + }; + }; + in + { + expr = (result.packages.a.default).name; + expected = "hello"; + }; + }; + formatter = { "test: conditional null throws helpful error" = { expr = diff --git a/modules/formatter.nix b/modules/formatter.nix index 90f1306..059a4ab 100644 --- a/modules/formatter.nix +++ b/modules/formatter.nix @@ -100,10 +100,9 @@ in '') config.allSystems); - perInput = system: flake: - optionalAttrs (flake?formatter.${system}) { - formatter = flake.formatter.${system}; - }; + perInput = system: flake: { + formatter = flake.formatter.${system}; + }; }; }