{ inputs = { nixpkgs = { url = "github:NixOS/nixpkgs/nixpkgs-unstable"; }; utils.url = "github:numtide/flake-utils"; mkElmDerivation.url = "github:jeslie0/mkElmDerivation"; flake-compat = { url = "github:edolstra/flake-compat"; flake = false; }; }; outputs = inputs: inputs.utils.lib.eachDefaultSystem ( system: let pkgs = import inputs.nixpkgs { localSystem = system; overlays = [ inputs.mkElmDerivation.overlays.default (final: prev: { example-spa-elm-app = prev.callPackage ( { stdenv, lib, elmPackages, uglify-js, rustPlatform, cargo, rustc, }: stdenv.mkDerivation ( let allPackagesJsonPath = "${inputs.mkElmDerivation}/mkElmDerivation/all-packages.json"; elmHashesJsonPath = "${inputs.mkElmDerivation}/mkElmDerivation/elm-hashes.json"; snapshot = import "${inputs.mkElmDerivation}/src/snapshot/default.nix" ( prev.haskellPackages // { inherit lib; } ); elmJson = ./frontend/elm.json; in { pname = "example-spa-elm-app"; version = "0.1.0"; src = inputs.self; nativeBuildInputs = [ elmPackages.elm uglify-js rustPlatform.cargoSetupHook cargo rustc ]; cargoDeps = pkgs.rustPlatform.importCargoLock { lockFile = ./backend/Cargo.lock; allowBuiltinFetchGit = true; }; cargoRoot = "backend"; makeFlags = [ "RELEASE=1" "frontend" "backend" ]; postPatch = '' patchShebangs ./frontend/build.sh ''; preBuild = '' ( cd frontend ${ (import "${inputs.mkElmDerivation}/nix/lib.nix" { inherit stdenv lib snapshot allPackagesJsonPath ; }).mkDotElmCommand elmHashesJsonPath elmJson } ) export ELM_HOME=$PWD/frontend/.elm ''; installPhase = '' runHook preInstall mkdir -p $out cp -r ./public $out/ cp ./backend/target/release/backend $out/ runHook postInstall ''; } ) ) { }; elm-go = prev.callPackage ( { lib, buildNpmPackage, elmPackages, }: buildNpmPackage { name = "elm-go"; version = "5.0.20"; src = pkgs.fetchFromGitHub { owner = "lucamug"; repo = "elm-go"; rev = "9a7bd8c980a03b026128fcd626b9395b4e2cb1e0"; sha256 = "sha256-B5Cngv8EGOY79u9aZeixA3EBt8rIc6bkYA4zoqycpk8="; }; npmDepsHash = "sha256-0LfLpUbav8cVoZ9/Cjb7Mr8jdo1/KjVcjR4lcYB3AzY="; dontNpmBuild = true; makeWrapperArgs = [ "--suffix PATH : ${lib.makeBinPath [ elmPackages.elm ]}" ]; } ) { }; }) ]; }; in { packages = { default = inputs.self.packages."${system}".example-spa-elm-app; example-spa-elm-app = pkgs.example-spa-elm-app; }; devShells.default = with pkgs; mkShell { inputsFrom = [ example-spa-elm-app ]; buildInputs = [ elm-go ]; }; } ); }