{ description = "My website, alanpearce.eu"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; inputs.utils.url = "github:numtide/flake-utils"; inputs.pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix"; inputs.pre-commit-hooks.inputs.nixpkgs.follows = "nixpkgs"; inputs.treefmt-nix.url = "github:numtide/treefmt-nix"; outputs = { self, nixpkgs, utils, pre-commit-hooks, treefmt-nix, ... }: utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs { inherit system; }; commonShellPackages = with pkgs; [ go hyperlink just ko flyctl redis ]; devPackages = with pkgs; [ wgo gofumpt gopls gotools systemfd modd ]; treefmtEval = treefmt-nix.lib.evalModule pkgs { projectRootFile = "flake.nix"; programs = { nixfmt.enable = true; taplo.enable = true; mdformat.enable = true; gofumpt.enable = true; golines.enable = true; prettier.enable = true; }; }; in { devShells = { ci = pkgs.mkShell { packages = commonShellPackages; }; default = pkgs.mkShell { inherit (self.checks.${system}.pre-commit-check) shellHook; packages = devPackages ++ commonShellPackages; }; }; formatter = treefmtEval.config.build.wrapper; checks = { pre-commit-check = pre-commit-hooks.lib.${system}.run { src = ./.; hooks = { go-mod-tidy = { enable = true; name = "go-mod-tidy"; description = "Run `go mod tidy`"; types_or = [ "go" "go-mod" ]; entry = "${pkgs.go}/bin/go mod tidy"; pass_filenames = false; }; golines.enable = true; golangci-lint = { enable = true; entry = let hookPkgs = pre-commit-hooks.packages.${system}; script = pkgs.writeShellScript "precommit-golangci-lint" '' set -e echo "$@" | xargs -n1 dirname | sort -u | xargs -n1 printf '"./%s" ' | \ xargs ${hookPkgs.golangci-lint}/bin/golangci-lint run --new --fix ''; in builtins.toString script; }; gotest.enable = true; }; }; }; } ); }