diff --git a/modules/aspects/provides/pkgs.nix b/modules/aspects/provides/pkgs.nix new file mode 100644 index 000000000..d3ab0831e --- /dev/null +++ b/modules/aspects/provides/pkgs.nix @@ -0,0 +1,79 @@ +{ den, ... }: +let + description = '' + Includes a package at User and Home levels. + + Works in NixOS/Darwin and standalone Home-Manager + + ## Usage + + # for NixOS/Darwin + den.aspects.my-user.includes = [ (den._.user-packages [ "hello" ]) ] + + # for standalone home-manager + den.aspects.my-home.includes = [ den._.user-packages [ "hello" ]) ] + + or globally (automatically applied depending on context): + + den.default.includes = [ den._.user-packages [ "hello" ]) ] + ''; + + hostPackages = + getPkgs: + let + nixos = { pkgs, ... }: { + environment.systemPackages = getPkgs pkgs; + }; + darwin = nixos; + in + { + inherit nixos darwin; + }; + + userPackages = + getPkgs: user: + let + nixos = { pkgs, ... }: { + users.users.${user.userName}.packages = getPkgs pkgs; + }; + darwin = nixos; + in + { + inherit nixos darwin; + }; + + homePackages = + getPkgs: + let + homeManager = { pkgs, ... }: { + home.packages = getPkgs pkgs; + }; + in + { + inherit homeManager; + }; + + to-host = getPkgs: den.lib.parametric.atLeast { + includes = [ ({ host, ... }: hostPackages getPkgs) ]; + }; + to-host-only = getPkgs: den.lib.perHost ({ host }: hostPackages getPkgs); + to-user = getPkgs: den.lib.perUser ({ host, user }: userPackages getPkgs user); + to-home = getPkgs: den.lib.perHome ({ home }: homePackages getPkgs); + + __functor = _self: getPkgs: { + includes = [ + (to-host-only getPkgs) + (to-user getPkgs) + (to-home getPkgs) + ]; + }; + +in +{ + den.provides.pkgs = { + inherit description __functor; + provides = { + inherit to-host to-user to-home; + }; + }; +} \ No newline at end of file diff --git a/templates/ci/modules/features/batteries/pkgs.nix b/templates/ci/modules/features/batteries/pkgs.nix new file mode 100644 index 000000000..c708e9af9 --- /dev/null +++ b/templates/ci/modules/features/batteries/pkgs.nix @@ -0,0 +1,74 @@ +{ denTest, ... }: +{ + flake.tests.pkgs = { + + test-pkgs-set-on-host = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.igloo.includes = [ (den._.pkgs (pkgs: pkgs.discord)) ]; + + expr = igloo.config.environment.systemPackages; + expected = [ "discord" ]; + } + ); + + test-pkgs-set-on-user = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den._.pkgs (pkgs: pkgs.discord)) ]; + + expr = igloo.config.users.users.tux.packages; + expected = [ "discord" ]; + } + ); + + test-pkgs-set-on-home-manager = denTest ( + { den, tuxHm, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.default.homeManager.home.stateVersion = "25.11"; + den.aspects.tux.includes = [ (den._.pkgs (pkgs: pkgs.discord)) ]; + + expr = tuxHm.config.home.packages; + expected = [ "discord" ]; + } + ); + + test-pkgs-to-host-set-on-host = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den._.pkgs._.to-host (pkgs: pkgs.discord)) ]; + + expr = igloo.config.environment.systemPackages; + expected = [ "discord" ]; + } + ); + + test-pkgs-to-user-set-on-user = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den._.pkgs._.to-user (pkgs: pkgs.discord)) ]; + + expr = igloo.config.users.users.tux.packages; + expected = [ "discord" ]; + } + ); + + test-pkgs-to-home-set-on-home-manager = denTest ( + { den, tuxHm, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.default.homeManager.home.stateVersion = "25.11"; + den.aspects.tux.includes = [ (den._.pkgs._.to-home (pkgs: pkgs.discord)) ]; + + expr = tuxHm.config.home.packages; + expected = [ "discord" ]; + } + ); + + }; +}