diff --git a/modules/modules.nix b/modules/modules.nix index d4e2cc311..417e42d41 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -97,6 +97,7 @@ let ./programs/distrobox.nix ./programs/earthly.nix ./programs/eclipse.nix + ./programs/element-desktop.nix ./programs/emacs.nix ./programs/eww.nix ./programs/eza.nix diff --git a/modules/programs/element-desktop.nix b/modules/programs/element-desktop.nix new file mode 100644 index 000000000..ab7a4c16d --- /dev/null +++ b/modules/programs/element-desktop.nix @@ -0,0 +1,121 @@ +{ + lib, + pkgs, + config, + ... +}: +let + inherit (lib) + types + mkIf + mkEnableOption + mkPackageOption + mkOption + ; + + cfg = config.programs.element-desktop; + + formatter = pkgs.formats.json { }; + + prefix = + if pkgs.stdenv.hostPlatform.isDarwin then "Library/Application Support" else config.xdg.configHome; +in +{ + meta.maintainers = with lib.hm.maintainers; [ aguirre-matteo ]; + + options.programs.element-desktop = { + enable = mkEnableOption "element-desktop"; + package = mkPackageOption pkgs "element-desktop" { nullable = true; }; + settings = mkOption { + type = formatter.type; + default = { }; + example = '' + { + default_server_config = { + "m.homeserver" = { + base_url = "https://matrix-client.matrix.org"; + server_name = "matrix.org"; + }; + "m.identity_server" = { + base_url = "https://vector.im"; + }; + }; + disable_custom_urls = false; + disable_guests = false; + disable_login_language_selector = false; + disable_3pid_login = false; + force_verification = false; + brand = "Element"; + integrations_ui_url = "https://scalar.vector.im/"; + integrations_rest_url = "https://scalar.vector.im/api"; + } + ''; + description = '' + Configuration settings for Element's default profiles. + WARNING: Element doesn't combine this config with the defaults, + so make sure to configure most options. For details about this + behavior and available configuration options see: + + ''; + }; + profiles = mkOption { + type = types.attrsOf formatter.type; + default = { }; + example = '' + { + work = { + default_server_config = { + "m.homeserver" = { + base_url = "https://matrix-client.matrix.org"; + server_name = "matrix.org"; + }; + "m.identity_server" = { + base_url = "https://vector.im"; + }; + }; + }; + home = { + disable_custom_urls = false; + disable_guests = false; + disable_login_language_selector = false; + disable_3pid_login = false; + }; + other = { + force_verification = false; + brand = "Element"; + integrations_ui_url = "https://scalar.vector.im/"; + integrations_rest_url = "https://scalar.vector.im/api"; + }; + } + ''; + description = '' + Extra profiles for Element. Those can be accessed using the + "--profile $NAME" flag. The same warning and options apply + here. + ''; + }; + }; + + config = mkIf cfg.enable { + home.packages = mkIf (cfg.package != null) [ cfg.package ]; + home.file = + let + defaultConfig = + if (cfg.settings != { }) then + { + "${prefix}/Element/config.json".source = ( + formatter.generate "element-desktop-default" cfg.settings + ); + } + else + { }; + in + defaultConfig + // (lib.mapAttrs' ( + name: value: + lib.nameValuePair "${prefix}/Element-${name}/config.json" { + source = (formatter.generate "element-desktop-${name}" cfg.profiles."${name}"); + } + ) cfg.profiles); + }; +} diff --git a/tests/default.nix b/tests/default.nix index f94d7eccf..67345ce11 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -326,6 +326,7 @@ import nmtSrc { ++ lib.optionals isDarwin [ ./modules/launchd ./modules/programs/aerospace + ./modules/programs/element-desktop/darwin.nix ./modules/services/emacs-darwin ./modules/services/espanso-darwin ./modules/services/git-sync-darwin @@ -359,6 +360,7 @@ import nmtSrc { ./modules/programs/boxxy ./modules/programs/cavalier ./modules/programs/distrobox + ./modules/programs/element-desktop/linux.nix ./modules/programs/eww ./modules/programs/firefox ./modules/programs/firefox/firefox.nix diff --git a/tests/modules/programs/element-desktop/cfg/default.json b/tests/modules/programs/element-desktop/cfg/default.json new file mode 100644 index 000000000..a8f144bd8 --- /dev/null +++ b/tests/modules/programs/element-desktop/cfg/default.json @@ -0,0 +1,19 @@ +{ + "brand": "Element", + "default_server_config": { + "m.homeserver": { + "base_url": "https://matrix-client.matrix.org", + "server_name": "matrix.org" + }, + "m.identity_server": { + "base_url": "https://vector.im" + } + }, + "disable_3pid_login": false, + "disable_custom_urls": false, + "disable_guests": false, + "disable_login_language_selector": false, + "force_verification": false, + "integrations_rest_url": "https://scalar.vector.im/api", + "integrations_ui_url": "https://scalar.vector.im/" +} diff --git a/tests/modules/programs/element-desktop/cfg/home.json b/tests/modules/programs/element-desktop/cfg/home.json new file mode 100644 index 000000000..9c143211a --- /dev/null +++ b/tests/modules/programs/element-desktop/cfg/home.json @@ -0,0 +1,6 @@ +{ + "disable_3pid_login": false, + "disable_custom_urls": false, + "disable_guests": false, + "disable_login_language_selector": false +} diff --git a/tests/modules/programs/element-desktop/cfg/other.json b/tests/modules/programs/element-desktop/cfg/other.json new file mode 100644 index 000000000..6874ca3d7 --- /dev/null +++ b/tests/modules/programs/element-desktop/cfg/other.json @@ -0,0 +1,6 @@ +{ + "brand": "Element", + "force_verification": false, + "integrations_rest_url": "https://scalar.vector.im/api", + "integrations_ui_url": "https://scalar.vector.im/" +} diff --git a/tests/modules/programs/element-desktop/cfg/work.json b/tests/modules/programs/element-desktop/cfg/work.json new file mode 100644 index 000000000..1890f8352 --- /dev/null +++ b/tests/modules/programs/element-desktop/cfg/work.json @@ -0,0 +1,11 @@ +{ + "default_server_config": { + "m.homeserver": { + "base_url": "https://matrix-client.matrix.org", + "server_name": "matrix.org" + }, + "m.identity_server": { + "base_url": "https://vector.im" + } + } +} diff --git a/tests/modules/programs/element-desktop/darwin.nix b/tests/modules/programs/element-desktop/darwin.nix new file mode 100644 index 000000000..cb23edf45 --- /dev/null +++ b/tests/modules/programs/element-desktop/darwin.nix @@ -0,0 +1 @@ +{ element-desktop-darwin = ./example-config-darwin.nix; } diff --git a/tests/modules/programs/element-desktop/example-config-darwin.nix b/tests/modules/programs/element-desktop/example-config-darwin.nix new file mode 100644 index 000000000..9ec3374af --- /dev/null +++ b/tests/modules/programs/element-desktop/example-config-darwin.nix @@ -0,0 +1,68 @@ +{ + programs.element-desktop = { + enable = true; + settings = { + default_server_config = { + "m.homeserver" = { + base_url = "https://matrix-client.matrix.org"; + server_name = "matrix.org"; + }; + "m.identity_server" = { + base_url = "https://vector.im"; + }; + }; + disable_custom_urls = false; + disable_guests = false; + disable_login_language_selector = false; + disable_3pid_login = false; + force_verification = false; + brand = "Element"; + integrations_ui_url = "https://scalar.vector.im/"; + integrations_rest_url = "https://scalar.vector.im/api"; + }; + profiles = { + work = { + default_server_config = { + "m.homeserver" = { + base_url = "https://matrix-client.matrix.org"; + server_name = "matrix.org"; + }; + "m.identity_server" = { + base_url = "https://vector.im"; + }; + }; + }; + home = { + disable_custom_urls = false; + disable_guests = false; + disable_login_language_selector = false; + disable_3pid_login = false; + }; + other = { + force_verification = false; + brand = "Element"; + integrations_ui_url = "https://scalar.vector.im/"; + integrations_rest_url = "https://scalar.vector.im/api"; + }; + }; + }; + + nmt.script = '' + assertFileExists "home-files/Library/Application Support/Element/config.json" + assertFileExists "home-files/Library/Application Support/Element-work/config.json" + assertFileExists "home-files/Library/Application Support/Element-home/config.json" + assertFileExists "home-files/Library/Application Support/Element-other/config.json" + + assertFileContent "home-files/Library/Application Support/Element/config.json" \ + ${./cfg/default.json} + + assertFileContent "home-files/Library/Application Support/Element-work/config.json" \ + ${./cfg/work.json} + + assertFileContent "home-files/Library/Application Support/Element-home/config.json" \ + ${./cfg/home.json} + + assertFileContent "home-files/Library/Application Support/Element-other/config.json" \ + ${./cfg/other.json} + ''; +} diff --git a/tests/modules/programs/element-desktop/example-config-linux.nix b/tests/modules/programs/element-desktop/example-config-linux.nix new file mode 100644 index 000000000..649930282 --- /dev/null +++ b/tests/modules/programs/element-desktop/example-config-linux.nix @@ -0,0 +1,68 @@ +{ + programs.element-desktop = { + enable = true; + settings = { + default_server_config = { + "m.homeserver" = { + base_url = "https://matrix-client.matrix.org"; + server_name = "matrix.org"; + }; + "m.identity_server" = { + base_url = "https://vector.im"; + }; + }; + disable_custom_urls = false; + disable_guests = false; + disable_login_language_selector = false; + disable_3pid_login = false; + force_verification = false; + brand = "Element"; + integrations_ui_url = "https://scalar.vector.im/"; + integrations_rest_url = "https://scalar.vector.im/api"; + }; + profiles = { + work = { + default_server_config = { + "m.homeserver" = { + base_url = "https://matrix-client.matrix.org"; + server_name = "matrix.org"; + }; + "m.identity_server" = { + base_url = "https://vector.im"; + }; + }; + }; + home = { + disable_custom_urls = false; + disable_guests = false; + disable_login_language_selector = false; + disable_3pid_login = false; + }; + other = { + force_verification = false; + brand = "Element"; + integrations_ui_url = "https://scalar.vector.im/"; + integrations_rest_url = "https://scalar.vector.im/api"; + }; + }; + }; + + nmt.script = '' + assertFileExists home-files/.config/Element/config.json + assertFileExists home-files/.config/Element-work/config.json + assertFileExists home-files/.config/Element-home/config.json + assertFileExists home-files/.config/Element-other/config.json + + assertFileContent home-files/.config/Element/config.json \ + ${./cfg/default.json} + + assertFileContent home-files/.config/Element-work/config.json \ + ${./cfg/work.json} + + assertFileContent home-files/.config/Element-home/config.json \ + ${./cfg/home.json} + + assertFileContent home-files/.config/Element-other/config.json \ + ${./cfg/other.json} + ''; +} diff --git a/tests/modules/programs/element-desktop/linux.nix b/tests/modules/programs/element-desktop/linux.nix new file mode 100644 index 000000000..6f4541ad2 --- /dev/null +++ b/tests/modules/programs/element-desktop/linux.nix @@ -0,0 +1 @@ +{ element-desktop-linux = ./example-config-linux.nix; }