{ inputs = { ihp.url = "github:digitallyinduced/ihp/v1.5"; nixpkgs.follows = "ihp/nixpkgs"; nixpkgs-nixos.follows = "ihp/nixpkgs-nixos"; flake-parts.follows = "ihp/flake-parts"; devenv.follows = "ihp/devenv"; systems.follows = "ihp/systems"; devenv-root = { url = "file+file:///dev/null"; flake = false; }; }; outputs = inputs@{ self, nixpkgs, nixpkgs-nixos, ihp, flake-parts, systems, ... }: flake-parts.lib.mkFlake { inherit inputs; } { systems = import systems; imports = [ ihp.flakeModules.default ]; perSystem = { pkgs, config, lib, ... }: { ihp = { appName = "ihp-railiance-probe"; enable = true; projectPath = ./.; packages = with pkgs; [ tailwindcss ]; haskellPackages = p: with p; [ p.ihp base wai text ]; devHaskellPackages = p: with p; [ cabal-install hlint hspec ihp-hspec ]; withHoogle = false; }; # OCI container image for Kubernetes deployment. # Build: nix build .#docker # Push: skopeo copy docker-archive:result docker://92.205.130.254:32166/coulomb/ihp-railiance-probe:SHA packages.docker = config.packages.unoptimized-docker-image; devenv.shells.default = { overlays = lib.mkAfter [ (final: prev: { ghc = prev.ghc.extend (hfinal: hprev: { mkDerivation = args: let drv = hprev.mkDerivation args; in if (args.pname or "") == "ihp-railiance-probe-models" then drv.overrideAttrs (old: { # GHC 9.10.3 Bug 1: Generated.ActualTypes.hi overflow. # Bug 2: libHSghc-9.10.3-5702.a truncated — use ghc-iserv-dyn. configureFlags = (old.configureFlags or []) ++ [ "--ghc-option=-O0" "--ghc-option=-fomit-interface-pragmas" "--disable-split-sections" "--ghc-option=-j1" "--ghc-option=-fexternal-interpreter" "--ghc-option=-pgmi" "--ghc-option=${hprev.ghc}/lib/ghc-9.10.3/bin/ghc-iserv-dyn" ]; postUnpack = (old.postUnpack or "") + '' _actual="$sourceRoot/build/Generated/ActualTypes.hs" _types=$( { awk '/^data [A-Z]|^newtype [A-Z]/{print $2"(..)"} /^type [A-Z]/{print $2}' \ "$sourceRoot/build/Generated/Enums.hs" find "$sourceRoot/build/Generated/ActualTypes" -name "*.hs" | \ sort | while IFS= read -r _m; do awk '/^data [A-Z]|^newtype [A-Z]/{print $2"(..)"} /^type [A-Z]/{print $2}' "$_m" done } | sort -u ) _exports=$(echo "$_types" | \ awk 'NR==1{printf " %s", $0; next} {printf "\n , %s", $0} END{printf "\n"}') _imports=$(awk '/^import Generated\./{print}' "$_actual") { printf 'module Generated.ActualTypes\n ( %s ) where\n' "$_exports" printf '%s\n' "$_imports" } > "$_actual.new" && mv "$_actual.new" "$_actual" ''; }) else drv; }); }) ]; env.GHCRTS = "-A32m -M2g"; processes = { tailwind.exec = "tailwindcss -c tailwind/tailwind.config.js -i ./tailwind/app.css -o static/app.css --watch=always"; }; }; }; }; nixConfig = { extra-substituters = [ "https://devenv.cachix.org" "https://cachix.cachix.org" "https://digitallyinduced.cachix.org" ]; extra-trusted-public-keys = [ "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=" "cachix.cachix.org-1:eWNHQldwUO7G2VkjpnjDbWwy4KQ/HNxht7H4SSoMckM=" "digitallyinduced.cachix.org-1:y+wQvrnxQ+PdEsCt91rmvv39qRCYzEgGQaldK26hCKE=" ]; }; }