/ flake.nix
flake.nix
  1  {
  2    description =
  3      "Ready-made templates for easily creating flake-driven environments";
  4  
  5    inputs = {
  6      nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  7      flake-utils.url = "github:numtide/flake-utils";
  8    };
  9  
 10    outputs = { self, flake-utils, nixpkgs }:
 11      {
 12        templates = rec {
 13          clojure = {
 14            path = ./clojure;
 15            description = "Clojure development environment";
 16          };
 17  
 18          cue = {
 19            path = ./cue;
 20            description = "Cue development environment";
 21          };
 22  
 23          dhall = {
 24            path = ./dhall;
 25            description = "Dhall development environment";
 26          };
 27  
 28          elixir = {
 29            path = ./elixir;
 30            description = "Elixir development environment";
 31          };
 32  
 33          elm = {
 34            path = ./elm;
 35            description = "Elm development environment";
 36          };
 37  
 38          gleam = {
 39            path = ./gleam;
 40            description = "Gleam development environment";
 41          };
 42  
 43          go = {
 44            path = ./go;
 45            description = "Go (Golang) development environment";
 46          };
 47  
 48          hashi = {
 49            path = ./hashi;
 50            description = "HashiCorp DevOps tools development environment";
 51          };
 52  
 53          haskell = {
 54            path = ./haskell;
 55            description = "Haskell development environment";
 56          };
 57  
 58          java = {
 59            path = ./java;
 60            description = "Java development environment";
 61          };
 62  
 63          kotlin = {
 64            path = ./kotlin;
 65            description = "Kotlin development environment";
 66          };
 67  
 68          nickel = {
 69            path = ./nickel;
 70            description = "Nickel development environment";
 71          };
 72  
 73          nim = {
 74            path = ./nim;
 75            description = "Nim development environment";
 76          };
 77  
 78          nix = {
 79            path = ./nix;
 80            description = "Nix development environment";
 81          };
 82  
 83          node = {
 84            path = ./node;
 85            description = "Node.js development environment";
 86          };
 87  
 88          opa = {
 89            path = ./opa;
 90            description = "Open Policy Agent development environment";
 91          };
 92  
 93          php = {
 94            path = ./php;
 95            description = "PHP development environment";
 96          };
 97  
 98          protobuf = {
 99            path = ./protobuf;
100            description = "Protobuf development environment";
101          };
102  
103          purescript = {
104            path = ./purescript;
105            description = "Purescript development environment";
106          };
107  
108          python = {
109            path = ./python;
110            description = "Python development environment";
111          };
112  
113          ruby = {
114            path = ./ruby;
115            description = "Ruby development environment";
116          };
117  
118          rust = {
119            path = ./rust;
120            description = "Rust development environment";
121          };
122  
123          rust-toolchain = {
124            path = ./rust-toolchain;
125            description = "Rust development environment with Rust version defined by a rust-toolchain.toml file";
126          };
127  
128          scala = {
129            path = ./scala;
130            description = "Scala development environment";
131          };
132  
133          zig = {
134            path = ./zig;
135            description = "Zig development environment";
136          };
137  
138          # Aliases
139          rt = rust-toolchain;
140        };
141      } // flake-utils.lib.eachDefaultSystem (system:
142        let
143          pkgs = import nixpkgs { inherit system; };
144          inherit (pkgs) mkShell writeScriptBin;
145          exec = pkg: "${pkgs.${pkg}}/bin/${pkg}";
146  
147          format = writeScriptBin "format" ''
148            ${exec "nixpkgs-fmt"} **/*.nix
149          '';
150  
151          dvt = writeScriptBin "dvt" ''
152            if [ -z $1 ]; then
153              echo "no template specified"
154              exit 1
155            fi
156  
157            TEMPLATE=$1
158  
159            ${exec "nix"} \
160              --experimental-features 'nix-command flakes' \
161              flake init \
162              --template \
163              "github:the-nix-way/dev-templates#''${TEMPLATE}"
164          '';
165  
166          update = writeScriptBin "update" ''
167            for dir in `ls -d */`; do # Iterate through all the templates
168              (
169                cd $dir
170                ${exec "nix"} flake update # Update flake.lock
171                ${exec "direnv"} reload    # Make sure things work after the update
172              )
173            done
174          '';
175        in
176        {
177          devShells = {
178            default = mkShell {
179              packages = [ format update ];
180            };
181          };
182  
183          packages = rec {
184            default = dvt;
185  
186            inherit dvt;
187          };
188        });
189  }