/ flake.nix
flake.nix
 1  {
 2    inputs = {
 3      flake-utils.url = "github:numtide/flake-utils";
 4      nixpkgs.url = "github:NixOS/nixpkgs";
 5    };
 6  
 7    outputs = {
 8      self,
 9      nixpkgs,
10      flake-utils,
11    }:
12      flake-utils.lib.eachDefaultSystem (
13        system: let
14          pkgs = nixpkgs.legacyPackages.${system};
15  
16          haskellPackages = pkgs.haskell.packages.ghc963.extend (hfinal: hprev: {
17            ormolu =
18              if pkgs.stdenv.isDarwin
19              then
20                pkgs.haskell.lib.overrideCabal hprev.ormolu (_: {
21                  enableSeparateBinOutput = false;
22                })
23              else hprev.ormolu;
24          });
25  
26          ignoreFiles = pkgs.nix-gitignore.gitignoreSourcePure ["hie.yaml" "*.nix" ./.gitignore];
27        in {
28          packages = {
29            default = self.packages.${system}.backend;
30  
31            backend = pkgs.haskell.lib.justStaticExecutables (
32              haskellPackages.callCabal2nix "breakdown"
33              (ignoreFiles (self + /backend))
34              {}
35            );
36  
37            frontend-deps = pkgs.mkYarnPackage {
38              src = ignoreFiles (self + /frontend);
39  
40              buildPhase = ''
41                yarn --offline build
42              '';
43            };
44  
45            frontend = pkgs.stdenvNoCC.mkDerivation {
46              pname = "breakdown-frontend";
47              inherit (self.packages.${system}.frontend-deps) version;
48  
49              src = "${self.packages.${system}.frontend-deps}/libexec/breakdown/deps/breakdown";
50  
51              installPhase = ''
52                mkdir -p $out
53                cp $src/static/index.html $src/dist/bundle.* $out
54              '';
55            };
56          };
57  
58          apps = {};
59  
60          devShell = pkgs.mkShell {
61            name = "breakdown";
62  
63            packages = [
64              (haskellPackages.ghcWithPackages (
65                _: let
66                  breakdown = self.packages.${system}.backend;
67                in
68                  breakdown.propagatedBuildInputs ++ breakdown.buildInputs
69              ))
70              haskellPackages.cabal-install
71              haskellPackages.haskell-language-server
72              haskellPackages.hlint
73              haskellPackages.fourmolu
74              pkgs.yarn
75              pkgs.nodePackages.typescript-language-server
76            ];
77          };
78        }
79      );
80  }