{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; treefmt-nix = { url = "github:numtide/treefmt-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, treefmt-nix, ... }: let lib = nixpkgs.lib; supportedSystems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"]; forEachSupportedSystem = f: lib.genAttrs supportedSystems (system: f { pkgs = import nixpkgs {inherit system;}; }); treefmtEval = forEachSupportedSystem ({pkgs, ...}: treefmt-nix.lib.evalModule pkgs ./treefmt.nix); in { devShells = forEachSupportedSystem ({pkgs, ...}: { default = pkgs.mkShell { packages = with pkgs; [ gleam beamMinimal29Packages.erlang beamMinimal29Packages.rebar3 ]; }; }); apps = forEachSupportedSystem ({pkgs, ...}: let cdInto = service: '' rootDir=$(jj --ignore-working-copy root || git rev-parse --show-toplevel) || (echo "error: can't find repo root?"; exit 1) cd "$rootDir/${service}" ''; runtimeInputs = with pkgs; [ gleam beamMinimal29Packages.erlang beamMinimal29Packages.rebar3 ]; in { # TODO: Check if env vars are already set # TODO: provide watch-{api,web} for easier dev api = { type = "app"; program = "${(pkgs.writeShellApplication { inherit runtimeInputs; name = "run-api"; text = '' ${cdInto "api"} export KATARI_DATA_PATH="$rootDir/data" ${pkgs.gleam}/bin/gleam run ''; })}/bin/run-api"; }; web = { type = "app"; program = "${(pkgs.writeShellApplication { inherit runtimeInputs; name = "run-web"; text = '' ${cdInto "web"} export KATARI_DATA_PATH="$rootDir/data" export KATARI_API_DOCS=true ${pkgs.gleam}/bin/gleam run ''; })}/bin/run-web"; }; }); formatter = forEachSupportedSystem ({pkgs, ...}: treefmtEval.${pkgs.stdenv.hostPlatform.system}.config.build.wrapper); checks = forEachSupportedSystem ({pkgs, ...}: { formatting = treefmtEval.${pkgs.stdenv.hostPlatform.system}.config.build.check self; }); }; }