{ inputs, pkgs, stdenv, lib, bun, coreutils, miso-lynx, ghc, }: rec { pname = "demo"; src = with lib.fileset; toSource rec { root = ./.; fileset = unions [ (root + "/LICENSE") (fileFilter ( file: lib.any file.hasExt [ "cabal" "hs" ] ) root) ]; }; haskellPackages = pkgs.pkgsCross.ghcjs.haskell.packages.${ghc}.extend ( with pkgs.haskell.lib; finalHaskellPkgs: previousHaskellPkgs: { # Includes BigInt patch to support the jsbi polyfill, for Quick/PrimJS ghc = previousHaskellPkgs.ghc.overrideAttrs (drv: drv // { patches = (drv.patches or []) ++ [ "${inputs.miso}/nix/patches/jsbi.patch" ]; }); # miso miso = finalHaskellPkgs.callCabal2nix "miso" inputs.miso {}; miso-lynx = finalHaskellPkgs.callCabal2nix "miso-lynx" inputs.miso-lynx {}; # deps jsaddle = finalHaskellPkgs.callCabal2nix "jsaddle" "${inputs.miso.inputs.jsaddle}/jsaddle" {}; ghcjs-base = finalHaskellPkgs.callCabal2nix "ghcjs-base" inputs.ghcjs-base {}; # cruft crypton = dontCheck previousHaskellPkgs.crypton; cryptonite = dontCheck previousHaskellPkgs.cryptonite; monad-logger = doJailbreak previousHaskellPkgs.monad-logger; string-interpolate = doJailbreak previousHaskellPkgs.string-interpolate; servant-server = doJailbreak previousHaskellPkgs.servant-server; }); package = haskellPackages.callCabal2nix pname src { }; miso-lynx-node_modules = stdenv.mkDerivation { pname = "miso-lynx-node_modules"; src = miso-lynx; version = "0.0.0"; nativeBuildInputs = [ bun ]; dontConfigure = true; # ExplanationNote: fixed-output derivation # cannot reference Nix store paths, # and the fixup phase would change /usr/bin/… into /nix/store/… dontFixup = true; buildPhase = '' export BUN_INSTALL_CACHE_DIR=$(mktemp -d) cp -v ${../nix/pkgs/miso-lynx/bun.lock} bun.lock bun install --force --frozen-lockfile --no-progress --production ''; installPhase = '' mkdir -p $out/node_modules cp -R ./node_modules $out ''; # CorrectionNote: this has to be updated each time bun.lock is # eg. with `bun install --lockfile-only` outputHash = "sha256-9UsvyZt1PMlPrnEDxQGWN0SOutD826ORZ7ODxbSC8jo="; outputHashAlgo = "sha256"; outputHashMode = "recursive"; }; mainLynxBundle = stdenv.mkDerivation { inherit pname; version = package.version; src = miso-lynx; nativeBuildInputs = [ bun ]; configurePhase = '' runHook preConfigure cp -r ${miso-lynx-node_modules}/node_modules . substituteInPlace node_modules/.bin/rspack \ --replace-fail "#!/usr/bin/env" "#!${coreutils}/bin/env" runHook postConfigure ''; buildPhase = '' runHook preBuild bun run js cp -v ${package}/bin/counter.jsexe/all.js . bun build --minify all.js --target=bun --outfile=dist/all.js bun run bundle runHook postBuild ''; installPhase = '' runHook preInstall mkdir $out cp -v dist/main.lynx.bundle $out/ runHook postInstall ''; }; }