From 765ad16b4fa557f9989a16cb4831365be3000ab7 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 4 Mar 2026 04:58:55 +0100 Subject: [PATCH] feat: make lib configurable --- .pre-commit-config.yaml | 1 + flake.lock | 136 ++++++++++++++++++++++++++++++ flake.nix | 180 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 317 insertions(+) create mode 120000 .pre-commit-config.yaml create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 120000 index 0000000..ae04f76 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1 @@ +/nix/store/041b74mcfyxy04kjz4pcmra2k3nzh5di-pre-commit-config.json \ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..73bcd98 --- /dev/null +++ b/flake.lock @@ -0,0 +1,136 @@ +{ + "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "NixOS", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "flake-compat", + "type": "github" + } + }, + "git-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1772024342, + "narHash": "sha256-+eXlIc4/7dE6EcPs9a2DaSY3fTA9AE526hGqkNID3Wg=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "6e34e97ed9788b17796ee43ccdbaf871a5c2b476", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1770073757, + "narHash": "sha256-Vy+G+F+3E/Tl+GMNgiHl9Pah2DgShmIUBJXmbiQPHbI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "47472570b1e607482890801aeaf29bfb749884f6", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1772542754, + "narHash": "sha256-WGV2hy+VIeQsYXpsLjdr4GvHv5eECMISX1zKLTedhdg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "8c809a146a140c5c8806f13399592dbcb1bb5dc4", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1770107345, + "narHash": "sha256-tbS0Ebx2PiA1FRW8mt8oejR0qMXmziJmPaU1d4kYY9g=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4533d9293756b63904b7238acb84ac8fe4c8c2c4", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "git-hooks": "git-hooks", + "nixpkgs": "nixpkgs_2", + "treefmt-nix": "treefmt-nix" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1770228511, + "narHash": "sha256-wQ6NJSuFqAEmIg2VMnLdCnUc0b7vslUohqqGGD+Fyxk=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "337a4fe074be1042a35086f15481d763b8ddc0e7", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..3c589af --- /dev/null +++ b/flake.nix @@ -0,0 +1,180 @@ +# flake.nix — devshell-lib +{ + description = "Shared devshell boilerplate library"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + git-hooks.url = "github:cachix/git-hooks.nix"; + treefmt-nix.url = "github:numtide/treefmt-nix"; + }; + + outputs = + { + self, + nixpkgs, + treefmt-nix, + git-hooks, + ... + }: + let + supportedSystems = [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; + in + { + lib = { + mkDevShell = + { + system, + extraPackages ? [ ], + extraShellHook ? "", + additionalHooks ? { }, + tools ? [ ], + # tools = list of { name, bin, versionCmd, color? } + # e.g. { name = "Bun"; bin = "${pkgs.bun}/bin/bun"; versionCmd = "--version"; color = "YELLOW"; } + formatters ? { }, + # formatters = treefmt-nix programs attrset, merged over { nixfmt.enable = true; } + # e.g. { gofmt.enable = true; shfmt.enable = true; } + formatterSettings ? { }, + # formatterSettings = treefmt-nix settings.formatter attrset + # e.g. { shfmt.options = [ "-i" "2" "-s" "-w" ]; } + features ? { }, + # features = opt-in lib-managed behaviours + # features.oxfmt = true → adds pkgs.oxfmt + pkgs.oxlint, enables oxfmt in treefmt + }: + let + pkgs = import nixpkgs { inherit system; }; + + oxfmtEnabled = features.oxfmt or false; + oxfmtPackages = pkgs.lib.optionals oxfmtEnabled [ + pkgs.oxfmt + pkgs.oxlint + ]; + oxfmtFormatters = pkgs.lib.optionalAttrs oxfmtEnabled { + oxfmt.enable = true; + }; + + treefmtEval = treefmt-nix.lib.evalModule pkgs { + projectRootFile = "flake.nix"; + programs = { + nixfmt.enable = true; # always on — every repo has a flake.nix + } + // oxfmtFormatters + // formatters; + settings.formatter = { } // formatterSettings; + }; + + pre-commit-check = git-hooks.lib.${system}.run { + src = ./.; + hooks = { + treefmt = { + enable = true; + entry = "${treefmtEval.config.build.wrapper}/bin/treefmt"; + pass_filenames = true; + }; + gitlint.enable = true; + gitleaks = { + enable = true; + entry = "${pkgs.gitleaks}/bin/gitleaks protect --staged"; + pass_filenames = false; + }; + tests = { + enable = true; + entry = "echo 'No tests defined yet.'"; + pass_filenames = false; + stages = [ "pre-push" ]; + }; + } + // additionalHooks; + }; + + toolBannerScript = pkgs.lib.concatMapStrings ( + t: + let + colorVar = "$" + (t.color or "YELLOW"); + in + '' + if command -v ${t.bin} >/dev/null 2>&1; then + printf " $CYAN ${t.name}:$RESET\t${colorVar}%s$RESET\n" "$(${t.bin} ${t.versionCmd})" + fi + '' + ) tools; + + in + { + inherit pre-commit-check; + + formatter = treefmtEval.config.build.wrapper; + + shell = pkgs.mkShell { + packages = extraPackages ++ oxfmtPackages; + + buildInputs = pre-commit-check.enabledPackages; + + shellHook = '' + ${pre-commit-check.shellHook} + + if [ -t 1 ]; then + command -v tput >/dev/null 2>&1 && tput clear || printf '\033c' + fi + + GREEN='\033[1;32m' + CYAN='\033[1;36m' + YELLOW='\033[1;33m' + BLUE='\033[1;34m' + RESET='\033[0m' + + printf "\n$GREEN 🚀 Dev shell ready$RESET\n\n" + ${toolBannerScript} + printf "\n" + + ${extraShellHook} + ''; + }; + }; + }; + + # Dogfood: this repo's own dev shell using the lib above + devShells = forAllSystems ( + system: + let + pkgs = import nixpkgs { inherit system; }; + env = self.lib.mkDevShell { + inherit system; + extraPackages = with pkgs; [ + nixfmt + gitlint + gitleaks + ]; + tools = [ + { + name = "Nix"; + bin = "${pkgs.nix}/bin/nix"; + versionCmd = "--version"; + color = "YELLOW"; + } + ]; + }; + in + { + default = env.shell; + } + ); + + checks = forAllSystems ( + system: + let + env = self.lib.mkDevShell { inherit system; }; + in + { + inherit (env) pre-commit-check; + } + ); + + formatter = forAllSystems (system: (self.lib.mkDevShell { inherit system; }).formatter); + }; +}