/ 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 }