194 lines
5.6 KiB
Nix
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; }
|