{ lib, stdenv, nodejs_22, pnpm_9, bash, makeWrapper, }: stdenv.mkDerivation (finalAttrs: { pname = "atbb"; version = "0.1.0"; src = lib.fileset.toSource { root = ../.; fileset = lib.fileset.unions [ ../package.json ../pnpm-lock.yaml ../pnpm-workspace.yaml ../turbo.json ../tsconfig.base.json ../apps ../packages ]; }; pnpmDeps = pnpm_9.fetchDeps { inherit (finalAttrs) pname version src; fetcherVersion = 1; hash = "sha256-isHNzvG9rTAyH7PYI7U85RilJv73FNpXNwmPDq40sI0="; }; nativeBuildInputs = [ nodejs_22 pnpm_9.configHook bash makeWrapper ]; buildPhase = '' runHook preBuild pnpm build runHook postBuild ''; installPhase = '' runHook preInstall mkdir -p $out # Workspace config cp package.json pnpm-lock.yaml pnpm-workspace.yaml $out/ # Root node_modules (pnpm virtual store — symlinks point into Nix store FOD) cp -r node_modules $out/ # Each workspace package: package.json + dist/ + local node_modules symlinks for pkg in apps/appview apps/web packages/db packages/atproto packages/cli packages/lexicon packages/logger; do mkdir -p "$out/$pkg" cp "$pkg/package.json" "$out/$pkg/" [ -d "$pkg/dist" ] && cp -r "$pkg/dist" "$out/$pkg/" [ -d "$pkg/node_modules" ] && cp -r "$pkg/node_modules" "$out/$pkg/" done # DB schema source (needed by drizzle.config.ts which references ../../packages/db/src/schema.ts) cp -r packages/db/src $out/packages/db/ # Drizzle migrations (needed for db:migrate at deploy time) cp -r apps/appview/drizzle $out/apps/appview/ cp -r apps/appview/drizzle-sqlite $out/apps/appview/ # Drizzle config files (needed by drizzle-kit migrate) cp apps/appview/drizzle.postgres.config.ts $out/apps/appview/ cp apps/appview/drizzle.sqlite.config.ts $out/apps/appview/ # Web static assets (CSS, favicon — served by hono serveStatic) cp -r apps/web/public $out/apps/web/ # CLI wrapper — makes `atbb` available on PATH mkdir -p $out/bin makeWrapper ${nodejs_22}/bin/node $out/bin/atbb \ --add-flags "$out/packages/cli/dist/index.js" runHook postInstall ''; meta = with lib; { description = "atBB — decentralized BB-style forum on AT Protocol"; license = licenses.agpl3Only; platforms = [ "x86_64-linux" "aarch64-linux" ]; }; })