elm-nix-template/flake.nix

119 lines
3.4 KiB
Nix

{
description = "Template for an Elm app defined by a Nix flake";
inputs = {
nixpkgs.url = "github:NixOs/nixpkgs/nixos-22.05";
utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, utils }:
utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
debugMode = false;
# These strings are specified this way so they aren't changed by sed
# Only the above `debugMode` variable is rewritten
# TODO: Fix this to be less hacky
isDebugMode = "debugMode = ${"true"};";
notDebugMode = "debugMode = ${"false"};";
scripts = with pkgs; [
(writeScriptBin "run-static" ''
nix build
firefox result/index.html
'')
(writeScriptBin "run-live" ''
pkill elm-live
elm-live src/Main.elm --open
'')
(writeScriptBin "update-deps" ''
elm2nix convert > nix/elm-srcs.nix
elm2nix snapshot
mv registry.dat nix
'')
(writeScriptBin "install-elm-dep" ''
elm install $1
update-deps
'')
# Replace debugMode variable from true to false
(writeScriptBin "build" ''
sed -i 's/${isDebugMode}/${notDebugMode}/' flake.nix
nix build
'')
# Replace debugMode variable from false to true
(writeScriptBin "dev" ''
sed -i 's/${notDebugMode}/${isDebugMode}/' flake.nix
nix build
'')
];
in
{
packages.elm-nix-template = pkgs.stdenv.mkDerivation {
name = "elm-nix-template";
version = "0.1.0";
src = ./.;
buildInputs = with pkgs.elmPackages; [
elm
pkgs.nodePackages.uglify-js
];
configurePhase = pkgs.elmPackages.fetchElmDeps {
elmVersion = "0.19.1";
elmPackages = import ./nix/elm-srcs.nix;
registryDat = ./nix/registry.dat;
};
buildPhase =
if debugMode then ''
elm make src/Main.elm --debug --output=$out/debug.js
'' else ''
elm make src/Main.elm --output=$out/main.js --optimize
uglifyjs $out/main.js --compress 'pure_funcs="F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9",pure_getters,keep_fargs=false,unsafe_comps,unsafe' \
| uglifyjs --mangle --output $out/main.min.js
rm $out/main.js
'';
installPhase = ''
mkdir -p $out
cp public/main.css $out
${if debugMode then ''
cp public/index.debug.html $out/index.html
''
else ''
cp public/index.html $out
''}
'';
};
packages.default = self.packages.${system}.elm-nix-template;
devShells.default = pkgs.mkShell {
buildInputs = with pkgs;
[
elmPackages.elm
elmPackages.nodejs
elmPackages.elm-xref
elmPackages.elm-test
elmPackages.elm-live
elmPackages.elm-json
elmPackages.elm-review
elmPackages.elm-format
elmPackages.elm-upgrade
elmPackages.elm-analyse
elmPackages.elm-language-server
elm2nix
] ++
scripts;
};
});
}