wand-front-utils/wand.nix
2022-09-27 20:32:14 -07:00

194 lines
5.6 KiB
Nix

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;
NODE_OPTIONS = "--openssl-legacy-provider";
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; }