flake.nix (5634B)
1 { 2 inputs = { 3 nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 4 elm2nix.url = "github:mtmn/elm2nix"; 5 }; 6 7 outputs = { 8 self, 9 nixpkgs, 10 elm2nix, 11 }: let 12 system = "x86_64-linux"; 13 pkgs = nixpkgs.legacyPackages.${system}; 14 15 inherit 16 (elm2nix.lib.elm2nix pkgs) 17 generateRegistryDat 18 prepareElmHomeScript 19 ; 20 21 duckdbPrebuilt = pkgs.fetchurl { 22 url = "https://registry.npmjs.org/@duckdb/node-bindings-linux-x64/-/node-bindings-linux-x64-1.5.2-r.1.tgz"; 23 hash = "sha256-IMn1URw5Cn5hN801LmHoI/XgGrezlkcF+5ItJNeclvg="; 24 }; 25 26 spagoRegistry = pkgs.fetchFromGitHub { 27 owner = "purescript"; 28 repo = "registry"; 29 rev = "7c020ee4076070dfc917ed0efa6129ce1b60c0a8"; 30 hash = "sha256-5fxgKomfEI0SqLC/b55H5mLitLbXGh1syEWzuupwK7Y="; 31 }; 32 33 spagoRegistryIndex = pkgs.fetchFromGitHub { 34 owner = "purescript"; 35 repo = "registry-index"; 36 rev = "0f05445d856c828ef029fd9a982e119038778eda"; 37 hash = "sha256-cwp/L0YgKtbwyL0JhUsR8VTubmGxoaYgjHEwmI4Cypo="; 38 }; 39 40 registryDat = generateRegistryDat {elmLock = ./elm.lock;}; 41 42 elmHomeScript = prepareElmHomeScript { 43 elmLock = ./elm.lock; 44 inherit registryDat; 45 }; 46 47 pnpmDeps = pkgs.fetchPnpmDeps { 48 src = pkgs.lib.cleanSourceWith { 49 src = self; 50 filter = name: _type: let 51 baseName = baseNameOf (toString name); 52 in 53 pkgs.lib.elem baseName [ 54 "package.json" 55 "pnpm-lock.yaml" 56 "pnpm-workspace.yaml" 57 ]; 58 name = "corpus-pnpm-source"; 59 }; 60 pname = "corpus"; 61 hash = "sha256-ghIjDWkrNTy3xegpHuCaIQur+EhObd1Y5ml6XgIXlKQ="; 62 fetcherVersion = 3; 63 }; 64 65 spagoDeps = pkgs.stdenv.mkDerivation { 66 name = "corpus-spago-deps"; 67 outputHashAlgo = "sha256"; 68 outputHashMode = "recursive"; 69 outputHash = "sha256-sdor+SLxjw/e+OQeBiEyKyWeBLVaGo2tcAxf06vxth8="; 70 71 src = pkgs.lib.cleanSourceWith { 72 src = self; 73 filter = name: _type: let 74 baseName = baseNameOf (toString name); 75 in 76 pkgs.lib.elem baseName [ 77 "package.json" 78 "pnpm-lock.yaml" 79 "pnpm-workspace.yaml" 80 "spago.yaml" 81 "spago.lock" 82 ]; 83 }; 84 85 nativeBuildInputs = with pkgs; [nodejs git cacert pnpm]; 86 87 buildPhase = '' 88 export HOME=$TMPDIR 89 export SSL_CERT_FILE="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" 90 export NODE_EXTRA_CA_CERTS="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" 91 92 mkdir -p $HOME/.cache/spago-nodejs 93 cp -r ${spagoRegistry} $HOME/.cache/spago-nodejs/registry 94 cp -r ${spagoRegistryIndex} $HOME/.cache/spago-nodejs/registry-index 95 chmod -R u+w $HOME/.cache/spago-nodejs 96 97 pnpm install --frozen-lockfile 98 patchShebangs node_modules 99 mkdir -p node_modules/.bin 100 pnpm spago install 101 ''; 102 103 installPhase = '' 104 mkdir -p $out 105 cp -r .spago/p $out/packages 106 ''; 107 }; 108 109 src = pkgs.lib.cleanSourceWith { 110 src = self; 111 filter = name: _type: let 112 relPath = 113 pkgs.lib.removePrefix (toString self + "/") (toString name); 114 topDir = builtins.head (pkgs.lib.splitString "/" relPath); 115 in 116 pkgs.lib.elem topDir [ 117 "package.json" 118 "pnpm-lock.yaml" 119 "pnpm-workspace.yaml" 120 "elm.json" 121 "spago.yaml" 122 "spago.lock" 123 "server.js" 124 "client.js" 125 "assets" 126 "users.json" 127 "src" 128 ]; 129 }; 130 131 corpus = pkgs.stdenv.mkDerivation { 132 pname = "corpus"; 133 inherit (builtins.fromJSON (builtins.readFile ./package.json)) version; 134 inherit src; 135 136 inherit pnpmDeps; 137 138 nativeBuildInputs = with pkgs; [ 139 makeWrapper 140 nodejs 141 git 142 elmPackages.elm 143 purescript 144 pnpm 145 pnpmConfigHook 146 ]; 147 148 buildPhase = '' 149 mkdir -p node_modules/@duckdb/node-bindings-linux-x64 150 tar -xf ${duckdbPrebuilt} -C node_modules/@duckdb/node-bindings-linux-x64 --strip-components=1 151 152 ln -sf ${pkgs.purescript}/bin/purs node_modules/.bin/purs 153 154 mkdir -p .spago 155 cp -r ${spagoDeps}/packages .spago/p 156 chmod -R u+w .spago 157 158 mkdir -p $HOME/.cache/spago-nodejs 159 cp -r ${spagoRegistry} $HOME/.cache/spago-nodejs/registry 160 cp -r ${spagoRegistryIndex} $HOME/.cache/spago-nodejs/registry-index 161 chmod -R u+w $HOME/.cache/spago-nodejs 162 163 eval ${elmHomeScript} 164 pnpm run release 165 ''; 166 167 installPhase = '' 168 mkdir -p $out/lib/corpus 169 cp -r server.js client.js users.json package.json node_modules assets $out/lib/corpus/ 170 mkdir -p $out/bin 171 makeWrapper ${pkgs.nodejs}/bin/node $out/bin/corpus-server \ 172 --add-flags "--no-deprecation" \ 173 --add-flags "$out/lib/corpus/server.js" \ 174 --chdir "$out/lib/corpus" 175 ''; 176 }; 177 dockerImage = pkgs.dockerTools.buildLayeredImage { 178 name = "corpus"; 179 tag = corpus.version; 180 contents = [corpus]; 181 extraCommands = "mkdir -p tmp"; 182 config.Cmd = ["${corpus}/bin/corpus-server"]; 183 }; 184 in { 185 devShells.${system}.default = pkgs.mkShell { 186 name = "corpus"; 187 packages = [ 188 elm2nix.packages.${system}.default 189 pkgs.nodejs 190 pkgs.elmPackages.elm 191 pkgs.elmPackages.elm-format 192 pkgs.elmPackages.elm-json 193 pkgs.pnpm 194 ]; 195 }; 196 197 packages.${system} = { 198 default = corpus; 199 container = dockerImage; 200 }; 201 }; 202 }