pkgs: inputs: let pnpm2nix = pkgs.callPackage inputs.pnpm2nix { }; 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 ${pkgs.google-chrome}/share/google/chrome $local_chromium/chrome-linux cp ${pkgs.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 ${pkgs.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 = [ pkgs.optipng ]; })); optipng-bin = ( drv: drv.overrideAttrs ( oldAttrs: { preBuild = '' mkdir -p $HOME/node_modules/optipng-bin/vendor ln -s ${pkgs.optipng}/bin/optipng $HOME/node_modules/optipng-bin/vendor/optipng ''; } ) ); jpegtran = (drv: drv.overrideAttrs (oldAttrs: { buildInputs = [ pkgs.libjpeg ]; })); jpegtran-bin = ( drv: drv.overrideAttrs ( oldAttrs: { preBuild = '' mkdir -p $HOME/node_modules/jpegtran-bin/vendor ln -s ${pkgs.libjpeg}/bin/jpegtran $HOME/node_modules/jpegtran-bin/vendor/jpegtran ''; } ) ); cwebp-bin = ( drv: drv.overrideAttrs ( oldAttrs: { buildPhase = '' mkdir -p $HOME/node_modules/cwebp-bin/vendor/ ln -s ${pkgs.libwebp}/bin/cwebp $HOME/node_modules/cwebp-bin/vendor/cwebp ''; } ) ); }; }; mkWandardFront = { name , prettyName ? name , description ? "" , themeColor ? "#000000" , backgroundColor ? "#000000" , src , nodePackages ? [ ] , routes ? [ "/" ] , extraHead ? "" , extraBody ? "" , extraPostBody ? "" }: let nodeSource = pkgs.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) ''; in pkgs.stdenv.mkDerivation { inherit name; src = elmCleanSource src; buildInputs = with pkgs.elmPackages; [ elm nodeSource ]; patchPhase = '' ln -sf ${nodeSource}/node_modules . cp ${webpackConfigFile} webpack.config.js cp ${ ./imagemin-jpgify-webpack-plugin.js } .imagemin-jpgify-webpack-plugin.js cp ${wandInit} wand.js ''; shellHook = '' ln -sf ${nodeSource}/node_modules . rm -f webpack.config.js rm -f wand.js cp ${webpackConfigFile} webpack.config.js cp ${ ./imagemin-jpgify-webpack-plugin.js } .imagemin-jpgify-webpack-plugin.js cp ${wandInit} wand.js export NODE_PATH=$PWD/node_modules ''; buildPhase = pkgs.elmPackages.fetchElmDeps { elmPackages = import (src + "/elm-srcs.nix"); registryDat = src + "/registry.dat"; elmVersion = "0.19.1"; }; installPhase = '' mkdir -p $out ${pkgs.nodejs}/bin/node ${nodeSource}/node_modules/webpack-cli/bin/cli.js --mode production mv dist/* $out ''; }; in { inherit mkWandardFront; }