{ description = "Kaptan development environment"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; outputs = { nixpkgs, ... }: let systems = [ "x86_64-linux" "aarch64-linux" ]; forAllSystems = nixpkgs.lib.genAttrs systems; perSystem = system: let pkgs = nixpkgs.legacyPackages.${system}; groundSuite = pkgs.buildNpmPackage { pname = "kaptan-ground-suite"; version = "0.1.0"; src = ./ground-suite; npmDepsHash = "sha256-l217EpOz2oEBQK6bzJV0DSEdBkK7HIlB4a7JMF+FadA="; npmBuildScript = "check"; PLAYWRIGHT_CHROMIUM_EXECUTABLE = "${pkgs.chromium}/bin/chromium"; installPhase = '' runHook preInstall mkdir -p $out/libexec/ground-suite cp -R dist node_modules src public scripts tests package.json package-lock.json tsconfig.json tsconfig.app.json vite.config.ts vitest.config.ts playwright.config.ts $out/libexec/ground-suite/ runHook postInstall ''; }; groundSuiteCommand = pkgs.writeShellApplication { name = "ground-suite"; runtimeInputs = [ pkgs.nodejs pkgs.coreutils pkgs.chromium ]; text = '' suite_root=${groundSuite}/libexec/ground-suite if [ "''${1:-}" = test ]; then shift test_root=$(mktemp -d -t kaptan-ground-suite-test.XXXXXX) trap 'rm -rf "$test_root"' EXIT cp -R "$suite_root" "$test_root/suite" chmod -R u+w "$test_root/suite" cd "$test_root/suite" export PLAYWRIGHT_CHROMIUM_EXECUTABLE=${pkgs.chromium}/bin/chromium npm test -- "$@" exit $? fi exec node "$suite_root/scripts/server.mjs" "$@" ''; }; in { inherit pkgs groundSuite groundSuiteCommand; }; in { packages = forAllSystems (system: let values = perSystem system; in { ground-suite = values.groundSuite; default = values.groundSuite; }); apps = forAllSystems (system: let values = perSystem system; in { ground-suite = { type = "app"; program = "${values.groundSuiteCommand}/bin/ground-suite"; }; }); checks = forAllSystems (system: let values = perSystem system; in { ground-suite = values.groundSuite; }); devShells = forAllSystems (system: let pkgs = nixpkgs.legacyPackages.${system}; python = pkgs.python3.withPackages (pythonPackages: with pythonPackages; [ pymavlink pyserial ]); in { default = pkgs.mkShell { packages = [ pkgs.rustup pkgs.dfu-util pkgs.mdbook pkgs.flutter python ]; }; ground-suite = pkgs.mkShell { packages = [ pkgs.nodejs ]; shellHook = '' echo "Kaptan Ground Suite development shell (Node $(node --version), npm $(npm --version))" echo "Run: cd ground-suite && npm ci && npm run dev" echo "SIMULATED DATA ONLY" ''; }; }); }; }