diff --git a/modules/aspects/provides/inputs.nix b/modules/aspects/provides/inputs.nix index b8bdf45..bb7e271 100644 --- a/modules/aspects/provides/inputs.nix +++ b/modules/aspects/provides/inputs.nix @@ -1,6 +1,12 @@ { den, withSystem, ... }: +let + inherit (den.lib) + parametric + take + ; +in { - den.provides.inputs' = den.lib.parametric.exactly { + den.provides.inputs' = parametric.exactly { description = '' Provides the `flake-parts` `inputs'` (the flake's `inputs` with system pre-selected) as a top-level module argument. @@ -30,12 +36,12 @@ ( { OS, host }: let - unused = den.lib.take.unused OS; + unused = take.unused OS; in withSystem host.system ( { inputs', ... }: - { - ${host.class}._module.args.inputs' = unused inputs'; + unused { + ${host.class}._module.args.inputs' = inputs'; } ) ) @@ -47,27 +53,27 @@ host, }: let - unused = den.lib.take.unused [ + unused = take.unused [ OS HM ]; in withSystem host.system ( { inputs', ... }: - { - ${user.class}._module.args.inputs' = unused inputs'; + unused { + ${user.class}._module.args.inputs' = inputs'; } ) ) ( { HM, home }: let - unused = den.lib.take.unused HM; + unused = take.unused HM; in withSystem home.system ( { inputs', ... }: - { - ${home.class}._module.args.inputs' = unused inputs'; + unused { + ${home.class}._module.args.inputs' = inputs'; } ) ) diff --git a/modules/aspects/provides/unfree/unfree-predicate-builder.nix b/modules/aspects/provides/unfree/unfree-predicate-builder.nix new file mode 100644 index 0000000..7b4054d --- /dev/null +++ b/modules/aspects/provides/unfree/unfree-predicate-builder.nix @@ -0,0 +1,91 @@ +{ den, lib, ... }: +let + inherit (den.lib) + parametric + take + ; + + description = '' + This is a private aspect always included in den.default. + + It adds a module option that gathers all packages defined + in den._.unfree usages and declares a + nixpkgs.config.allowUnfreePredicate for each class. + + ''; + + unfreeComposableModule.options.unfree = { + packages = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + }; + }; + + nixosAspect = + { config, ... }: + { + nixpkgs.config.allowUnfreePredicate = (pkg: builtins.elem (lib.getName pkg) config.unfree.packages); + }; + + homeManagerAspect = + { config, osConfig, ... }: + { + nixpkgs = lib.mkIf (!osConfig.home-manager.useGlobalPkgs) { + config.allowUnfreePredicate = (pkg: builtins.elem (lib.getName pkg) config.unfree.packages); + }; + }; + + aspect = parametric.exactly { + inherit description; + includes = [ + ( + { OS, host }: + let + unused = take.unused OS; + in + { + ${host.class}.imports = unused [ + unfreeComposableModule + nixosAspect + ]; + } + ) + ( + { + OS, + HM, + user, + host, + }: + let + unused = take.unused [ + OS + HM + host + ]; + in + { + ${user.class}.imports = unused [ + unfreeComposableModule + homeManagerAspect + ]; + } + ) + ( + { HM, home }: + let + unused = take.unused HM; + in + { + ${home.class}.imports = unused [ + unfreeComposableModule + nixosAspect + ]; + } + ) + ]; + }; +in +{ + den.default.includes = [ aspect ]; +} diff --git a/modules/aspects/provides/unfree.nix b/modules/aspects/provides/unfree/unfree.nix similarity index 79% rename from modules/aspects/provides/unfree.nix rename to modules/aspects/provides/unfree/unfree.nix index f722cd2..3fae230 100644 --- a/modules/aspects/provides/unfree.nix +++ b/modules/aspects/provides/unfree/unfree.nix @@ -1,4 +1,4 @@ -{ lib, den, ... }: +{ den, ... }: { den.provides.unfree.description = '' A class generic aspect that enables unfree packages by name. @@ -16,6 +16,6 @@ _self: allowed-names: { class, aspect-chain }: den.lib.take.unused aspect-chain { - ${class}.nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) allowed-names; + ${class}.unfree.packages = allowed-names; }; } diff --git a/templates/examples/flake.lock b/templates/examples/flake.lock index 28a0008..9b316e9 100644 --- a/templates/examples/flake.lock +++ b/templates/examples/flake.lock @@ -22,11 +22,11 @@ }, "den": { "locked": { - "lastModified": 1763707606, - "narHash": "sha256-l9v3NNdKj3GJvV5LhzsWDs4Sl2bg0tuKNFFkMeFvUWo=", + "lastModified": 1767645236, + "narHash": "sha256-VMrWett3fWRb0hQh9K1JUC3zV2OlV4zOajFZHGr1GPw=", "owner": "vic", "repo": "den", - "rev": "8164e0d89c59839d67757bc9a1fb61770dc6e8b7", + "rev": "e7837daa0ea0f03fba62a2653ce16314a7d9d1c8", "type": "github" }, "original": { diff --git a/templates/examples/modules/_example/ci/unfree.nix b/templates/examples/modules/_example/ci/unfree.nix index ee4863d..4766e32 100644 --- a/templates/examples/modules/_example/ci/unfree.nix +++ b/templates/examples/modules/_example/ci/unfree.nix @@ -1,6 +1,25 @@ { den, ... }: + +let + codeAspect = { + includes = [ (den._.unfree [ "vscode" ]) ]; + homeManager.programs.vscode.enable = true; + }; + discordAspect = { + includes = [ + (den._.unfree [ "discord" ]) + ]; + homeManager = + { pkgs, ... }: + { + home.packages = [ pkgs.discord ]; + }; + }; +in { - # cam uses unfree vscode. - den.aspects.cam.homeManager.programs.vscode.enable = true; - den.aspects.cam.includes = [ (den._.unfree [ "vscode" ]) ]; + # cam uses unfree vscode and discord loaded from different aspects. + den.aspects.cam.includes = [ + codeAspect + discordAspect + ]; }