{ pkgs, google-chrome, symlinkJoin, stdenv, elmPackages, libjpeg, optipng, pngquant, ... }: let pnpm2nix = pkgs.callPackage (builtins.fetchGit { url = "https://github.com/notgne2/pnpm2nix.git"; rev = "909accd35d23664254b43109ee58cd0c3d83a6d9"; }) {}; 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; }; 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 ''; })); imagemin-pngquant = (drv: drv.overrideAttrs(oldAttrs: { buildInputs = oldAttrs.buildInputs ++ [ pkgs.libpng ]; })); pngquant-bin = (drv: drv.overrideAttrs(oldAttrs: { preBuild = '' mkdir -p $HOME/node_modules/pngquant-bin/vendor ln -s ${pngquant}/bin/pngquant $HOME/node_modules/pngquant-bin/vendor/pngquant ''; })); gifsicle = (drv: drv.overrideAttrs(oldAttrs: { buildInputs = oldAttrs.buildInputs ++ [ pkgs.autoconf pkgs.automake ]; })); optipng = (drv: drv.overrideAttrs(oldAttrs: { buildInputs = [ optipng ]; })); optipng-bin = (drv: drv.overrideAttrs(oldAttrs: { preBuild = '' mkdir -p $HOME/node_modules/optipng-bin/vendor ln -s ${optipng}/bin/optipng $HOME/node_modules/optipng-bin/vendor/optipng ''; })); jpegtran = (drv: drv.overrideAttrs(oldAttrs: { buildInputs = [ libjpeg ]; })); jpegtran-bin = (drv: drv.overrideAttrs(oldAttrs: { preBuild = '' mkdir -p $HOME/node_modules/jpegtran-bin/vendor ln -s ${libjpeg}/bin/jpegtran $HOME/node_modules/jpegtran-bin/vendor/jpegtran ''; })); }; }; mkWandardFront = { name, prettyName ? name, description ? "", themeColor ? "#000000", backgroundColor ? "#000000", src, nodePackages ? [], routes ? [ "/" ], }: let nodeSource = symlinkJoin { name = "${name}-node-sources"; paths = [ builderPkg.lib ] ++ nodePackages; }; baseWebpackConfig = builtins.readFile ./webpack.config.js; webpackConfig = '' const ROUTES = ${builtins.toJSON routes} const PRETTY_NAME = ${builtins.toJSON prettyName} const DESCRIPTION = ${builtins.toJSON description} const THEME_COLOR = ${builtins.toJSON themeColor} const BACKGROUND_COLOR = ${builtins.toJSON backgroundColor} '' + "\n" + baseWebpackConfig; webpackConfigFile = pkgs.writeText "${name}-webpack-config" webpackConfig; wandInit = pkgs.writeText "wand.js" '' document.body.innerHTML = ''' const sourceTarget = document.createElement('script') sourceTarget.src = '/main.js' document.body.appendChild(sourceTarget) ''; templateHtml = pkgs.writeText "template.html" '' ${prettyName} ''; in stdenv.mkDerivation { inherit name; src = elmCleanSource src; buildInputs = with elmPackages; [ elm elm-format nodeSource ]; patchPhase = '' ln -sf ${nodeSource}/node_modules . rm -f webpack.config.js rm -f wand.js rm -f template.html cp ${webpackConfigFile} webpack.config.js cp ${wandInit} wand.js cp ${templateHtml} template.html ''; shellHook = '' ln -sf ${nodeSource}/node_modules . cp ${webpackConfigFile} webpack.config.js cp ${wandInit} wand.js cp ${templateHtml} template.html export NODE_PATH=$PWD/node_modules ''; buildPhase = elmPackages.fetchElmDeps { elmPackages = import (src + "/elm-srcs.nix"); registryDat = src + "/registry.dat"; elmVersion = "0.19.1"; }; installPhase = '' mkdir -p $out ${nodeSource}/node_modules/webpack-cli/bin/cli.js --mode production mv dist/* $out ''; }; in { inherit mkWandardFront; }