{ lib, stdenv, callPackage, buildNpmPackage, fetchNpmDeps, makeDesktopItem, autoPatchelfHook, copyDesktopItems, makeWrapper, electron_39, steam-run-free, src, }: buildNpmPackage (finalAttrs: { pname = "bs-manager"; version = (lib.importJSON "${finalAttrs.src}/package.json").version; inherit src; postPatch = '' # Don't search for resources in electron's resource directory, but our own. substituteInPlace src/main/services/utils.service.ts \ --replace-fail "process.resourcesPath" "'$out/share/bs-manager/resources'" # Replace vendored DepotDownloader with our own. rm assets/scripts/DepotDownloader ln -s ${finalAttrs.passthru.depotdownloader}/bin/DepotDownloader assets/scripts/DepotDownloader ''; npmDepsHash = "sha256-wmPZv1lqGr31wBGaeLw7LL6ZMzq/x8lkoy/iMxU+M80="; extraNpmDeps = fetchNpmDeps { name = "${finalAttrs.pname}-${finalAttrs.version}-extra-npm-deps"; inherit (finalAttrs) src; sourceRoot = "${baseNameOf finalAttrs.src}/release/app"; hash = "sha256-jE/M22QQzuTS0zgcB+tLEL8Ey61HE8MP7H1MTX060gY="; }; makeCacheWritable = true; env.ELECTRON_SKIP_BINARY_DOWNLOAD = "1"; npmRebuildFlags = [ "--ignore-scripts" ]; nativeBuildInputs = [ autoPatchelfHook copyDesktopItems makeWrapper ]; buildInputs = [ stdenv.cc.cc ]; preBuild = '' pushd release/app rm -r "$npm_config_cache" npmDeps="$extraNpmDeps" npmConfigHook npm run postinstall popd ''; postBuild = '' cp -r ${electron_39.dist} electron-dist chmod -R u+w electron-dist npm exec electron-builder -- \ --dir \ --config=electron-builder.config.js \ -c.electronDist=electron-dist \ -c.electronVersion=${electron_39.version} # glibc NixOS cannot satisfy musl-linked prebuilts; remove unused musl addons. for unpacked in release/build/*-unpacked; do nm="$unpacked/resources/app.asar.unpacked/node_modules" if [[ -d "$nm" ]]; then find "$nm" -depth -type d -name '*musl*' -exec rm -rf {} ';' fi done ''; installPhase = '' runHook preInstall for icon in build/icons/png/*.png; do install -Dm644 $icon $out/share/icons/hicolor/$(basename $icon .png)/apps/bs-manager.png done mkdir -p $out/share/bs-manager cp -r release/build/*-unpacked/{locales,resources{,.pak}} $out/share/bs-manager makeWrapper ${lib.getExe electron_39} $out/bin/bs-manager \ --set-default ELECTRON_FORCE_IS_PACKAGED 1 \ --add-flags $out/share/bs-manager/resources/app.asar \ --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \ --prefix PATH : ${lib.makeBinPath [ steam-run-free ]} \ --inherit-argv0 runHook postInstall ''; desktopItems = [ (makeDesktopItem { desktopName = "BSManager"; name = "BSManager"; exec = "bs-manager"; terminal = false; type = "Application"; icon = "bs-manager"; mimeTypes = [ "x-scheme-handler/bsmanager" "x-scheme-handler/beatsaver" "x-scheme-handler/bsplaylist" "x-scheme-handler/modelsaber" "x-scheme-handler/web+bsmap" ]; categories = [ "Utility" "Game" ]; }) ]; passthru = { depotdownloader = callPackage ./depotdownloader { }; }; meta = { changelog = "https://github.com/Zagrios/bs-manager/blob/v${finalAttrs.version}/CHANGELOG.md"; description = "Manage maps, mods and more for Beat Saber"; homepage = "https://github.com/Zagrios/bs-manager"; license = lib.licenses.gpl3Only; mainProgram = "bs-manager"; maintainers = [ ]; platforms = lib.platforms.linux; sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; }; })