diff --git a/modules/programs/vscode/default.nix b/modules/programs/vscode/default.nix index a12d019e..fd7d0881 100644 --- a/modules/programs/vscode/default.nix +++ b/modules/programs/vscode/default.nix @@ -17,8 +17,8 @@ let cfg = config.programs.vscode; - vscodePname = cfg.package.pname; - vscodeVersion = cfg.package.version; + vscodePname = cfg.package.pname or cfg.pname; + vscodeVersion = cfg.package.version or pkgs.vscode.version; jsonFormat = pkgs.formats.json { }; @@ -383,10 +383,25 @@ in enable = lib.mkEnableOption "Visual Studio Code"; package = lib.mkPackageOption pkgs "vscode" { + nullable = true; example = "pkgs.vscodium"; extraDescription = "Version of Visual Studio Code to install."; }; + pname = mkOption { + type = types.nullOr types.str; + default = null; + example = "vscode"; + description = '' + The package name (pname) of the VS Code variant being used. + Required when {option}`programs.vscode.package` is set to + `null`, so that {option}`programs.vscode.nameShort` and + {option}`programs.vscode.dataFolderName` can be derived from + known products. Has no effect when + {option}`programs.vscode.package` is set. + ''; + }; + mutableExtensionsDir = mkOption { type = types.bool; default = allProfilesExceptDefault == { }; @@ -449,6 +464,13 @@ in }; config = mkIf cfg.enable { + assertions = [ + { + assertion = cfg.package != null || cfg.pname != null; + message = "programs.vscode.pname must be set when programs.vscode.package is null."; + } + ]; + warnings = [ (mkIf (allProfilesExceptDefault != { } && cfg.mutableExtensionsDir) "programs.vscode.mutableExtensionsDir can be used only if no profiles apart from default are set." @@ -465,7 +487,7 @@ in ) ]; - home.packages = [ cfg.package ]; + home.packages = lib.mkIf (cfg.package != null) [ cfg.package ]; # The file `${userDir}/globalStorage/storage.json` needs to be writable by VSCode, # since it contains other data, such as theme backgrounds, recently opened folders, etc. @@ -625,6 +647,7 @@ in ] ) && defaultProfile != { } + && cfg.package != null ) { # Whenever our immutable extensions.json changes, force VSCode to regenerate diff --git a/tests/modules/programs/vscode/default.nix b/tests/modules/programs/vscode/default.nix index ad3cca85..a9f646bb 100644 --- a/tests/modules/programs/vscode/default.nix +++ b/tests/modules/programs/vscode/default.nix @@ -35,6 +35,10 @@ let unknownTests = lib.mapAttrs' ( k: v: lib.nameValuePair "vscode-${k}-unknown" (v unknownPackage) ) tests; + + nullPackageTests = { + vscode-null-package = import ./null-package.nix; + }; in -knownTests // unknownTests +knownTests // unknownTests // nullPackageTests diff --git a/tests/modules/programs/vscode/null-package.nix b/tests/modules/programs/vscode/null-package.nix new file mode 100644 index 00000000..d9ababe6 --- /dev/null +++ b/tests/modules/programs/vscode/null-package.nix @@ -0,0 +1,36 @@ +{ + config, + pkgs, + lib, + ... +}: + +let + cfg = config.programs.vscode; + + settingsPath = + if pkgs.stdenv.hostPlatform.isDarwin then + "Library/Application Support/${cfg.nameShort}/User/settings.json" + else + ".config/${cfg.nameShort}/User/settings.json"; + + expectedSettings = pkgs.writeText "expected-settings.json" '' + { + "editor.fontSize": 14 + } + ''; +in + +{ + programs.vscode = { + enable = true; + package = null; + pname = "vscode"; + profiles.default.userSettings."editor.fontSize" = 14; + }; + + nmt.script = '' + assertFileExists "home-files/${settingsPath}" + assertFileContent "home-files/${settingsPath}" "${expectedSettings}" + ''; +}