wand-front-utils/default.nix

110 lines
3.4 KiB
Nix

{ 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;
wandInit = pkgs.writeText "wand.js" ''
document.body.innerHTML = '''
const sourceTarget = document.createElement('script')
sourceTarget.src = '/main.js'
document.body.appendChild(sourceTarget)
'';
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
cp ${wandInit} wand.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;
}