{ lib, src, stdenv, bun, makeBinaryWrapper, node-gyp, nodejs, python3, writableTmpDirAsHomeHook, }: let serverPackageJson = lib.importJSON "${src}/apps/server/package.json"; pname = "t3code-server"; version = serverPackageJson.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" ]; in stdenv.mkDerivation (finalAttrs: { inherit pname version; inherit src; strictDeps = true; nodeModules = stdenv.mkDerivation { pname = "${pname}-node-modules"; inherit (finalAttrs) version src; nativeBuildInputs = [ bun nodejs 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)" bun install \ --frozen-lockfile \ --ignore-scripts \ --linker=hoisted \ --no-progress \ --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-l0BXsHRRFPyWjdxWedAdS8K7VdXSzAfw5c+0caqzT6M="; outputHashAlgo = "sha256"; outputHashMode = "recursive"; }; nativeBuildInputs = [ bun makeBinaryWrapper node-gyp nodejs python3 writableTmpDirAsHomeHook ]; configurePhase = '' runHook preConfigure mkdir -p ./node_modules cp -R ${finalAttrs.nodeModules}/. ./node_modules/ chmod -R u+rwX node_modules 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 --cwd apps/web build bun run --cwd apps/server build runHook postBuild ''; installPhase = '' runHook preInstall mkdir -p "$out/libexec/t3code/apps/server" mkdir -p "$out/libexec/t3code/apps" mkdir -p "$out/libexec/t3code/packages" cp -R --no-preserve=mode node_modules "$out/libexec/t3code/" cp -R --no-preserve=mode apps/server/dist "$out/libexec/t3code/apps/server/" cp -R --no-preserve=mode apps/web "$out/libexec/t3code/apps/" cp -R --no-preserve=mode packages/client-runtime "$out/libexec/t3code/packages/" cp -R --no-preserve=mode packages/contracts "$out/libexec/t3code/packages/" cp -R --no-preserve=mode packages/effect-acp "$out/libexec/t3code/packages/" cp -R --no-preserve=mode packages/effect-codex-app-server "$out/libexec/t3code/packages/" cp -R --no-preserve=mode packages/shared "$out/libexec/t3code/packages/" makeWrapper ${lib.getExe nodejs} "$out/bin/t3" \ --add-flags "$out/libexec/t3code/apps/server/dist/bin.mjs" runHook postInstall ''; meta = { description = "t3 code web/server app"; homepage = "https://github.com/pingdotgg/t3code"; license = lib.licenses.mit; mainprogram = "t3"; platforms = lib.platforms.unix; sourceprovenance = with lib.sourcetypes; [fromsource]; }; })