summaryrefslogtreecommitdiff
path: root/modules/home/arkenfox/default.nix
diff options
context:
space:
mode:
authorSeth Flynn <[email protected]>2025-03-04 12:56:51 -0500
committerSeth Flynn <[email protected]>2025-03-04 12:56:51 -0500
commita69ac1ee37566dda8fe4bf90ed3f324b66b580d8 (patch)
treeeb2286a7a2fe3cf53fa2feeaf00fd107da404379 /modules/home/arkenfox/default.nix
parent5fd79c0fafb17f6ecce88c1aeeef17efacf6ada5 (diff)
home/arkenfox: init
Diffstat (limited to 'modules/home/arkenfox/default.nix')
-rw-r--r--modules/home/arkenfox/default.nix126
1 files changed, 126 insertions, 0 deletions
diff --git a/modules/home/arkenfox/default.nix b/modules/home/arkenfox/default.nix
new file mode 100644
index 0000000..58f2501
--- /dev/null
+++ b/modules/home/arkenfox/default.nix
@@ -0,0 +1,126 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+let
+ # ===
+ ## Pollyfill from mkFirefoxModule
+ ## https://github.com/nix-community/home-manager/blob/70fbbf05a5594b0a72124ab211bff1d502c89e3f/modules/programs/firefox/mkFirefoxModule.nix
+ # ===
+
+ inherit (pkgs.stdenv.hostPlatform) isDarwin;
+
+ cfg = config.programs.firefox;
+
+ profilesPath = if isDarwin then "${cfg.configPath}/Profiles" else cfg.configPath;
+
+ # ===
+ ## Actual module
+ # ===
+
+ arkenfoxVersions = lib.mapAttrs (
+ tag: hash:
+ pkgs.fetchFromGitHub {
+ owner = "arkenfox";
+ repo = "user.js";
+ inherit tag hash;
+ }
+ ) (lib.importJSON ./arkenfox-hashes.json);
+
+ arkenfoxProfiles = lib.filterAttrs (lib.const (profile: profile.arkenfox.enable)) cfg.profiles;
+
+ arkenfoxSubmodule =
+ { config, ... }:
+ {
+ options = {
+ arkenfox = {
+ enable = lib.mkEnableOption "arkenfox";
+
+ version = lib.mkOption {
+ type = lib.types.str;
+ default = lib.versions.majorMinor pkgs.firefox.version;
+ defaultText = lib.literalExpression "lib.versions.majorMinor pkgs.firefox.version";
+ description = ''
+ Version of Arkenfox to apply.
+
+ This should match a tag in https://github.com/arkenfox/user.js.
+ '';
+ };
+
+ source = lib.mkOption {
+ type = lib.types.path;
+ internal = true;
+ };
+ };
+ };
+
+ config = {
+ arkenfox.source = lib.mkDefault arkenfoxVersions.${config.arkenfox.version};
+ };
+ };
+in
+
+{
+ options.programs.firefox.profiles = lib.mkOption {
+ type = lib.types.attrsOf (lib.types.submodule arkenfoxSubmodule);
+ };
+
+ config = {
+ home = {
+ # TODO: Find a better way to do this
+ activation.arkenfoxPrefsCleaner = lib.mkIf (arkenfoxProfiles != [ ]) (
+ lib.hm.dag.entryAfter [ "writeBoundary" "linkGeneration" ] (
+ lib.concatLines (
+ lib.mapAttrsToList (lib.const (
+ profile:
+
+ let
+ prefsCleanerPath = "${config.home.homeDirectory}/${profilesPath}/${profile.path}/prefsCleaner.sh";
+ in
+
+ "run --quiet cp ${
+ profile.arkenfox.source + "/prefsCleaner.sh"
+ } ${prefsCleanerPath} && run --quiet ${prefsCleanerPath}"
+ )) arkenfoxProfiles
+ )
+ )
+ );
+
+ file = lib.mkMerge (
+ lib.mapAttrsToList (lib.const (
+ profile:
+
+ let
+ shouldCreateUserJs =
+ profile.preConfig != ""
+ || profile.settings != { }
+ || profile.extraConfig != ""
+ || profile.bookmarks != [ ]
+ || profile.arkenfox.enable;
+
+ userJsPath = "${profilesPath}/${profile.path}/user.js";
+
+ homeManagerUserJs =
+ pkgs.writeText "home-manager-firefox-profile-${profile.name}-home-manager-userjs"
+ (toString config.home.file.${userJsPath}.text);
+ in
+
+ {
+ ${userJsPath} = lib.mkIf shouldCreateUserJs {
+ source = pkgs.runCommand "home-manager-firefox-profile-${profile.name}-userjs" { } ''
+ echo "// Generated by getchoo's Arkenfox module" > $out
+ echo >> $out
+ cat ${profile.arkenfox.source + "/user.js"} >> $out
+ echo >> $out
+ cat ${homeManagerUserJs} >> $out
+ '';
+ };
+ }
+ )) cfg.profiles
+ );
+ };
+ };
+}