/ flake.nix
flake.nix
  1  {
  2    description = "The format that's super!";
  3  
  4    inputs = {
  5      nixpkgs.url = "nixpkgs/nixpkgs-unstable";
  6      crane.url = "github:ipetkov/crane";
  7      flake-utils.url = "github:numtide/flake-utils";
  8      rust-overlay = {
  9        url = "github:oxalica/rust-overlay";
 10        inputs.nixpkgs.follows = "nixpkgs";
 11      };
 12    };
 13  
 14    outputs =
 15      {
 16        self,
 17        nixpkgs,
 18        crane,
 19        flake-utils,
 20        rust-overlay,
 21        ...
 22      }:
 23      flake-utils.lib.eachDefaultSystem (
 24        system:
 25        let
 26          rustChannel = "stable";
 27          rustVersion = "latest";
 28  
 29          pkgs = import nixpkgs {
 30            inherit system;
 31            overlays = [ (import rust-overlay) ];
 32          };
 33  
 34          inherit (pkgs) lib;
 35  
 36          craneLib = (crane.mkLib pkgs).overrideToolchain (
 37            pkgs:
 38            pkgs.rust-bin.${rustChannel}.${rustVersion}.default.override {
 39              targets = [
 40                "wasm32-unknown-unknown"
 41                "wasm32-wasip2"
 42              ];
 43            }
 44          );
 45  
 46          src = lib.fileset.toSource {
 47            root = ./.;
 48            fileset = lib.fileset.unions [
 49              ./Cargo.toml
 50              ./Cargo.lock
 51              (craneLib.fileset.commonCargoSources ./axum_duper)
 52              (craneLib.fileset.commonCargoSources ./duper)
 53              (craneLib.fileset.commonCargoSources ./duper-js-node)
 54              (craneLib.fileset.commonCargoSources ./duper-js-wasm/rust)
 55              (craneLib.fileset.commonCargoSources ./duper-python)
 56              (craneLib.fileset.commonCargoSources ./duper_lsp)
 57              (craneLib.fileset.commonCargoSources ./duper_rpc)
 58              (craneLib.fileset.commonCargoSources ./duper_uniffi)
 59              (craneLib.fileset.commonCargoSources ./duper_website)
 60              (craneLib.fileset.commonCargoSources ./duper_zed)
 61              (craneLib.fileset.commonCargoSources ./duperfmt)
 62              (craneLib.fileset.commonCargoSources ./duperq)
 63              (craneLib.fileset.commonCargoSources ./serde_duper)
 64              (craneLib.fileset.commonCargoSources ./serde_duper_macros)
 65              (craneLib.fileset.commonCargoSources ./tracing_duper)
 66              (craneLib.fileset.commonCargoSources ./tree-sitter-duper)
 67              (lib.fileset.fileFilter (file: file.hasExt "md") ./.)
 68              ./.config
 69              ./.cargo/config.toml
 70              ./duper/src/visitor/snapshots
 71              ./duper/src/serde/snapshots
 72              ./duperfmt/src/duper.scm
 73              ./duperfmt/src/snapshots
 74              ./duperq/tests/data
 75              ./duper_uniffi/src/duper.udl
 76              ./tree-sitter-duper/src
 77              ./tree-sitter-duper/queries
 78            ];
 79          };
 80  
 81          commonArgs = {
 82            inherit src;
 83            strictDeps = true;
 84            version = "0";
 85            pname = "duper";
 86  
 87            nativeBuildInputs = with pkgs; [
 88              cmake
 89              llvmPackages.bintools
 90              python3
 91            ];
 92          };
 93  
 94          cargoArtifacts = craneLib.buildDepsOnly commonArgs;
 95  
 96          individualCrateArgs = commonArgs // {
 97            inherit cargoArtifacts;
 98            doCheck = false;
 99          };
100  
101          duperfmt = craneLib.buildPackage (
102            individualCrateArgs
103            // {
104              inherit (craneLib.crateNameFromCargoToml { cargoToml = ./duperfmt/Cargo.toml; }) pname version;
105              cargoExtraArgs = "-p duperfmt";
106            }
107          );
108  
109          duperq = craneLib.buildPackage (
110            individualCrateArgs
111            // {
112              inherit (craneLib.crateNameFromCargoToml { cargoToml = ./duperq/Cargo.toml; }) pname version;
113              cargoExtraArgs = "-p duperq";
114            }
115          );
116  
117          duper_lsp = craneLib.buildPackage (
118            individualCrateArgs
119            // {
120              inherit (craneLib.crateNameFromCargoToml { cargoToml = ./duper_lsp/Cargo.toml; }) pname version;
121              cargoExtraArgs = "-p duper_lsp";
122            }
123          );
124        in
125        {
126          packages = {
127            inherit duperfmt duperq duper_lsp;
128          };
129  
130          apps = {
131            duperfmt =
132              (flake-utils.lib.mkApp {
133                drv = duperfmt;
134              })
135              // {
136                meta = {
137                  description = "Official Duper formatting library and CLI";
138                  homepage = "https://duper.dev.br";
139                  license = lib.licenses.mit;
140                  mainProgram = "sandhole";
141                  platforms = lib.platforms.linux ++ lib.platforms.darwin;
142                };
143              };
144            duperq =
145              (flake-utils.lib.mkApp {
146                drv = duperq;
147              })
148              // {
149                meta = {
150                  description = "A fast Duper and JSON filter/processor";
151                  homepage = "https://duper.dev.br";
152                  license = lib.licenses.mit;
153                  mainProgram = "sandhole";
154                  platforms = lib.platforms.linux ++ lib.platforms.darwin;
155                };
156              };
157            duper_lsp =
158              (flake-utils.lib.mkApp {
159                drv = duper_lsp;
160              })
161              // {
162                meta = {
163                  description = "Official Duper language server, with auto-formatting and diagnostics";
164                  homepage = "https://duper.dev.br";
165                  license = lib.licenses.mit;
166                  mainProgram = "sandhole";
167                  platforms = lib.platforms.linux ++ lib.platforms.darwin;
168                };
169              };
170          };
171  
172          checks = {
173            duper-clippy = craneLib.cargoClippy (
174              commonArgs
175              // {
176                inherit cargoArtifacts;
177              }
178            );
179  
180            duper-doc = craneLib.cargoDoc (
181              commonArgs
182              // {
183                inherit cargoArtifacts;
184              }
185            );
186  
187            duper-fmt = craneLib.cargoFmt (
188              commonArgs
189              // {
190                inherit cargoArtifacts;
191              }
192            );
193  
194            duper-test = craneLib.cargoNextest (
195              commonArgs
196              // {
197                inherit cargoArtifacts;
198                cargoNextestExtraArgs = "-P nix";
199              }
200            );
201          };
202  
203          devShells.default = craneLib.devShell {
204            checks = self.checks.${system};
205  
206            packages =
207              let
208                cargo-rail-version = "0.8.1";
209                cargo-rail = craneLib.buildPackage {
210                  pname = "cargo-rail";
211                  version = cargo-rail-version;
212                  src = pkgs.fetchFromGitHub {
213                    owner = "loadingalias";
214                    repo = "cargo-rail";
215                    tag = "v${cargo-rail-version}";
216                    hash = "sha256-GlApp4rJ/X5lSD2c3KJ5ll0ZBXEIY3DbWwMM1O/ryXw=";
217                  };
218                  doCheck = false;
219                };
220              in
221              [
222                pkgs.binaryen
223                pkgs.bun
224                pkgs.cargo-insta
225                cargo-rail
226                pkgs.dotnet-sdk_8
227                pkgs.jdk21_headless
228                pkgs.just
229                pkgs.llvmPackages.bintools
230                pkgs.nodejs_24
231                pkgs.tree-sitter
232                pkgs.uv
233                pkgs.wasm-bindgen-cli_0_2_100
234              ];
235          };
236        }
237      );
238  }