{ lib, src, asar, stdenv, bun, copyDesktopItems, electron_40, gcc, git, gnumake, makeDesktopItem, makeWrapper, node-gyp, nodejs, pkg-config, python3, writableTmpDirAsHomeHook, xdg-utils, }: let desktopPackageJson = lib.importJSON "${src}/apps/desktop/package.json"; pname = "t3code-desktop"; version = desktopPackageJson.version; workspacePreparePatched = [ "apps/server/package.json" "apps/web/package.json" "packages/client-runtime/package.json" "packages/contracts/package.json" "packages/effect-acp/package.json" "packages/effect-codex-app-server/package.json" "packages/shared/package.json" ]; desktopItem = makeDesktopItem { name = "t3code"; desktopName = "T3 Code"; exec = "t3code %U"; icon = "t3code"; categories = ["Development"]; startupWMClass = "t3code"; }; in stdenv.mkDerivation (finalAttrs: { inherit pname version; inherit src; strictDeps = true; patches = [./patches/desktop-nix-autoupdate.patch]; nodeModules = stdenv.mkDerivation { pname = "${pname}-node-modules"; inherit (finalAttrs) version src; impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "GIT_PROXY_COMMAND" "SOCKS_SERVER" ]; nativeBuildInputs = [ bun gcc gnumake nodejs pkg-config python3 writableTmpDirAsHomeHook ]; dontConfigure = true; dontFixup = true; postPatch = '' for packageJson in ${lib.concatStringsSep " " workspacePreparePatched}; do substituteInPlace "$packageJson" \ --replace-fail '"prepare": "effect-language-service patch"' '"prepare": "true"' done ''; buildPhase = '' runHook preBuild export HOME="$TMPDIR" export BUN_INSTALL_CACHE_DIR="$(mktemp -d)" export ELECTRON_SKIP_BINARY_DOWNLOAD=1 export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 export npm_config_build_from_source=true bun install \ --frozen-lockfile \ --ignore-scripts \ --linker=hoisted \ --no-progress \ --filter ./apps/desktop \ --filter ./apps/server \ --filter ./apps/web \ --filter ./packages/client-runtime \ --filter ./packages/contracts \ --filter ./packages/effect-acp \ --filter ./packages/effect-codex-app-server \ --filter ./packages/shared runHook postBuild ''; installPhase = '' runHook preInstall cp -R ./node_modules $out runHook postInstall ''; outputHash = "sha256-mzcaRKIymMQb934wrto/mBuKt0KzncbzUQ0rzkCLlC4="; outputHashAlgo = "sha256"; outputHashMode = "recursive"; }; nativeBuildInputs = [ asar bun copyDesktopItems gcc gnumake makeWrapper node-gyp nodejs pkg-config python3 writableTmpDirAsHomeHook ]; desktopItems = [desktopItem]; env = { ELECTRON_SKIP_BINARY_DOWNLOAD = "1"; PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = "1"; npm_config_build_from_source = "true"; npm_config_nodedir = "${nodejs}"; }; configurePhase = '' runHook preConfigure mkdir -p ./node_modules cp -R ${finalAttrs.nodeModules}/. ./node_modules/ chmod -R u+rw node_modules if [ -d node_modules/.bin ]; then chmod -R u+x node_modules/.bin fi patchShebangs node_modules cd node_modules/node-pty node-gyp rebuild node scripts/post-install.js cd "$NIX_BUILD_TOP/$sourceRoot" runHook postConfigure ''; buildPhase = '' runHook preBuild export HOME="$TMPDIR" export BUN_INSTALL_CACHE_DIR="$(mktemp -d)" bun run build:desktop node ${./patches/build-nix-desktop-package.mjs} --output-dir packaged-app cp -R node_modules packaged-app/node_modules chmod -R u+rwX packaged-app/node_modules patchShebangs packaged-app/node_modules find packaged-app/node_modules -xtype l -delete rm -rf packaged-app/node_modules/electron rm -f packaged-app/node_modules/.bin/electron asar pack --unpack='{*.node}' packaged-app packaged-app.asar runHook postBuild ''; installPhase = '' runHook preInstall install -d "$out/share/${pname}/resources" install -Dm644 packaged-app.asar "$out/share/${pname}/resources/app.asar" if [ -d packaged-app.asar.unpacked ]; then cp -R packaged-app.asar.unpacked "$out/share/${pname}/resources/" fi install -Dm644 apps/desktop/resources/icon.png \ "$out/share/icons/hicolor/512x512/apps/t3code.png" makeWrapper ${lib.getExe electron_40} "$out/bin/t3code" \ --set T3CODE_DISABLE_AUTO_UPDATE 1 \ --set-default ELECTRON_FORCE_IS_PACKAGED 1 \ --set-default ELECTRON_IS_DEV 0 \ --prefix PATH : ${lib.makeBinPath [ git xdg-utils ]} \ --add-flags "$out/share/${pname}/resources/app.asar" runHook postInstall ''; meta = { description = "T3 Code desktop app"; homepage = "https://github.com/pingdotgg/t3code"; license = lib.licenses.mit; mainProgram = "t3code"; platforms = ["x86_64-linux"]; sourceProvenance = with lib.sourceTypes; [fromSource]; }; })