{ pkgs, google-chrome, symlinkJoin, stdenv, elmPackages, ... }: let pnpm2nix = pkgs.callPackage (builtins.fetchGit { url = "https://github.com/notgne2/pnpm2nix.git"; rev = "21e7f567485d5095343d5c397638e4dbeca0b4a4"; }) {}; nodeCleanSourceFilter = name: type: pkgs.lib.cleanSourceFilter name type && ((baseNameOf name) != "node_modules"); nodeCleanSource = src: pkgs.lib.cleanSourceWith { filter = nodeCleanSourceFilter; inherit src; }; elmCleanSourceFilter = name: type: nodeCleanSourceFilter name type && ((baseNameOf name) != "elm-stuff" && (baseNameOf name) != "dist"); elmCleanSource = src: pkgs.lib.cleanSourceWith { filter = elmCleanSourceFilter; inherit src; }; scrapeNodeDeps = nodePkg: let nodeDeps = (builtins.filter (x: builtins.hasAttr "nodejs" x) nodePkg.buildInputs); in pkgs.lib.unique (nodeDeps ++ builtins.concatLists (map scrapeNodeDeps nodeDeps)); findNodeDep = nodePkg: name: (builtins.elemAt 0 (builtins.filter (x: x.pname == name) (scrapeNodeDeps nodePkg))); builderPkg = pnpm2nix.mkPnpmPackage { name = "builder-node-packages"; packageJSON = ./package.json; pnpmLock = ./pnpm-lock.yaml; src = nodeCleanSource ./.; overrides = pnpm2nix.defaultPnpmOverrides // { puppeteer = (drv: drv.overrideAttrs(oldAttrs: { preBuild = '' # Define the local chromium directory local_chromium=$HOME/node_modules/puppeteer/.local-chromium/linux-686378 # Make sure that directory exists mkdir -p $local_chromium # Link pkgs' standard google chrome into place cp -r --no-preserve=mode,ownership ${google-chrome}/share/google/chrome $local_chromium/chrome-linux cp ${google-chrome}/bin/google-chrome-stable $local_chromium/chrome-linux/chrome chmod +x $local_chromium/chrome-linux/chrome ''; })); }; }; mkWandardFront = { name, src, nodePackages ? null, routes ? [ "/" ], }: let nodeSource = symlinkJoin { name = "${name}-node-sources"; paths = [ builderPkg.lib ] ++ (if nodePackages != null then [ nodePackages ] else [ ]); }; baseWebpackConfig = builtins.readFile ./webpack.config.js; webpackConfig = '' const ROUTES = ${builtins.toJSON routes} '' + "\n" + baseWebpackConfig; webpackConfigFile = pkgs.writeText "${name}-webpack-config" webpackConfig; in stdenv.mkDerivation { inherit name; src = elmCleanSource src; buildInputs = with elmPackages; [ elm elm-format nodeSource ]; patchPhase = '' ln -sf ${nodeSource}/node_modules . cp ${webpackConfigFile} webpack.config.js ''; shellHook = '' ln -sf ${nodeSource}/node_modules . ''; buildPhase = elmPackages.fetchElmDeps { elmPackages = import (src + "/elm-srcs.nix"); versionsDat = src + "/versions.dat"; }; installPhase = '' mkdir -p $out ${nodeSource}/node_modules/webpack-cli/bin/cli.js --mode production ls dist cp -r dist/* $out ''; }; in { inherit mkWandardFront; }