Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / by-name / ve / vesktop / package.nix
blob0094284f814bc328122723cfa26d7ac5176a58c2
1 { lib
2 , stdenv
3 , stdenvNoCC
4 , gcc13Stdenv
5 , fetchFromGitHub
6 , substituteAll
7 , makeWrapper
8 , makeDesktopItem
9 , copyDesktopItems
10 , vencord
11 , electron
12 , pipewire
13 , libpulseaudio
14 , libicns
15 , jq
16 , moreutils
17 , nodePackages
19 stdenv.mkDerivation (finalAttrs: {
20   pname = "vesktop";
21   version = "0.4.3";
23   src = fetchFromGitHub {
24     owner = "Vencord";
25     repo = "Vesktop";
26     rev = "v${finalAttrs.version}";
27     hash = "sha256-wGOyDGY0FpAVS5+MTiKrOpDyd13ng0RLGAENW5tXuR4=";
28   };
30   # NOTE: This requires pnpm 8.10.0 or newer
31   # https://github.com/pnpm/pnpm/pull/7214
32   pnpmDeps =
33     assert lib.versionAtLeast nodePackages.pnpm.version "8.10.0";
34     stdenvNoCC.mkDerivation {
35       pname = "${finalAttrs.pname}-pnpm-deps";
36       inherit (finalAttrs) src version patches ELECTRON_SKIP_BINARY_DOWNLOAD;
38       nativeBuildInputs = [
39         jq
40         moreutils
41         nodePackages.pnpm
42       ];
44       pnpmPatch = builtins.toJSON {
45         pnpm.supportedArchitectures = {
46           os = [ "linux" ];
47           cpu = [ "x64" "arm64" ];
48         };
49       };
51       postPatch = ''
52         mv package.json package.json.orig
53         jq --raw-output ". * $pnpmPatch" package.json.orig > package.json
54       '';
56       # https://github.com/NixOS/nixpkgs/blob/763e59ffedb5c25774387bf99bc725df5df82d10/pkgs/applications/misc/pot/default.nix#L56
57       installPhase = ''
58         export HOME=$(mktemp -d)
60         pnpm config set store-dir $out
61         pnpm install --frozen-lockfile --ignore-script
63         rm -rf $out/v3/tmp
64         for f in $(find $out -name "*.json"); do
65           sed -i -E -e 's/"checkedAt":[0-9]+,//g' $f
66           jq --sort-keys . $f | sponge $f
67         done
68       '';
70       dontBuild = true;
71       dontFixup = true;
72       outputHashMode = "recursive";
73       outputHash = "sha256-nNXe0vSQiQTkiRqgScKlpkpG/BJc2eIY2ueAd9sk36c=";
74     };
76   nativeBuildInputs = [
77     copyDesktopItems
78     nodePackages.pnpm
79     nodePackages.nodejs
80     makeWrapper
81   ];
83   patches = [
84     (substituteAll { inherit vencord; src = ./use_system_vencord.patch; })
85   ];
87   ELECTRON_SKIP_BINARY_DOWNLOAD = 1;
89   preBuild = ''
90     export HOME=$(mktemp -d)
91     export STORE_PATH=$(mktemp -d)
93     cp -Tr "$pnpmDeps" "$STORE_PATH"
94     chmod -R +w "$STORE_PATH"
96     pnpm config set store-dir "$STORE_PATH"
97     pnpm install --offline --frozen-lockfile --ignore-script
98     patchShebangs node_modules/{*,.*}
99   '';
101   postBuild = ''
102     pnpm build
103     # using `pnpm exec` here apparently makes it ignore ELECTRON_SKIP_BINARY_DOWNLOAD
104     ./node_modules/.bin/electron-builder \
105       --dir \
106       -c.electronDist=${electron}/libexec/electron \
107       -c.electronVersion=${electron.version}
108   '';
110   # this is consistent with other nixpkgs electron packages and upstream, as far as I am aware
111   # yes, upstream really packages it as "vesktop" but uses "vencorddesktop" file names
112   installPhase =
113     let
114       # this is mainly required for venmic
115       libPath = lib.makeLibraryPath [
116         libpulseaudio
117         pipewire
118         gcc13Stdenv.cc.cc.lib
119       ];
120     in
121     ''
122       runHook preInstall
124       mkdir -p $out/opt/Vesktop/resources
125       cp dist/linux-*unpacked/resources/app.asar $out/opt/Vesktop/resources
127       pushd build
128       ${libicns}/bin/icns2png -x icon.icns
129       for file in icon_*x32.png; do
130         file_suffix=''${file//icon_}
131         install -Dm0644 $file $out/share/icons/hicolor/''${file_suffix//x32.png}/apps/vencorddesktop.png
132       done
134       makeWrapper ${electron}/bin/electron $out/bin/vencorddesktop \
135         --prefix LD_LIBRARY_PATH : ${libPath} \
136         --add-flags $out/opt/Vesktop/resources/app.asar \
137         --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
139       runHook postInstall
140     '';
142   desktopItems = [
143     (makeDesktopItem {
144       name = "vencorddesktop";
145       desktopName = "Vesktop";
146       exec = "vencorddesktop %U";
147       icon = "vencorddesktop";
148       startupWMClass = "VencordDesktop";
149       genericName = "Internet Messenger";
150       keywords = [ "discord" "vencord" "electron" "chat" ];
151     })
152   ];
154   passthru = {
155     inherit (finalAttrs) pnpmDeps;
156   };
158   meta = with lib; {
159     description = "An alternate client for Discord with Vencord built-in";
160     homepage = "https://github.com/Vencord/Vesktop";
161     license = licenses.gpl3Only;
162     maintainers = with maintainers; [ getchoo Scrumplex vgskye pluiedev ];
163     platforms = [ "x86_64-linux" "aarch64-linux" ];
164     mainProgram = "vencorddesktop";
165   };