about summary refs log tree commit diff
path: root/website/sandbox/chord-drill-sergeant/default.nix
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-04-17T23·10+0100
committerWilliam Carroll <wpcarro@gmail.com>2020-04-17T23·10+0100
commit39d084e493c80952d59cbcc92ea67f344e543298 (patch)
treee6c867937521644c7d5ffb0f4d4cb8bb2da53ae1 /website/sandbox/chord-drill-sergeant/default.nix
parent277ad983d4d9caf51679d3c1c615ecc7134539be (diff)
Use elm2nix to (attempt to) deploy learnpianochords.app
After a few failed attempts at deploying my Elm application on NixOS, I'm trying
elm2nix, which some NixOS and Elm users created to attempt to solve some of the
issues that I ran into earlier today.

Elm tries to write to $HOME, which NixOS doesn't like. I typically prefer to
avoid things like cabal2nix, elm2nix, node2nix because I don't like the workflow
that they suggest, but I'm so eager to deploy this application, that I'm trying
it.
Diffstat (limited to 'website/sandbox/chord-drill-sergeant/default.nix')
-rw-r--r--website/sandbox/chord-drill-sergeant/default.nix70
1 files changed, 53 insertions, 17 deletions
diff --git a/website/sandbox/chord-drill-sergeant/default.nix b/website/sandbox/chord-drill-sergeant/default.nix
index 7ea92c29f5c1..98f548e359d4 100644
--- a/website/sandbox/chord-drill-sergeant/default.nix
+++ b/website/sandbox/chord-drill-sergeant/default.nix
@@ -1,24 +1,60 @@
-{ pkgs, ... }:
+{ pkgs ? <nixpkgs>, ... }:
 
-pkgs.stdenv.mkDerivation {
+with pkgs;
+
+let
+  mkDerivation =
+    { srcs ? ./elm-srcs.nix
+    , src
+    , name
+    , srcdir ? "./src"
+    , targets ? []
+    , registryDat ? ./registry.dat
+    , outputJavaScript ? false
+    }:
+    stdenv.mkDerivation {
+      inherit name src;
+
+      buildInputs = [ elmPackages.elm ]
+        ++ lib.optional outputJavaScript nodePackages_10_x.uglify-js;
+
+      buildPhase = pkgs.elmPackages.fetchElmDeps {
+        elmPackages = import srcs;
+        elmVersion = "0.19.1";
+        inherit registryDat;
+      };
+
+      installPhase = let
+        elmfile = module: "${srcdir}/${builtins.replaceStrings ["."] ["/"] module}.elm";
+        extension = if outputJavaScript then "js" else "html";
+      in ''
+        mkdir -p $out/share/doc
+        ${lib.concatStrings (map (module: ''
+          echo "compiling ${elmfile module}"
+          elm make ${elmfile module} --output $out/${module}.${extension} --docs $out/share/doc/${module}.json
+          ${lib.optionalString outputJavaScript ''
+            echo "minifying ${elmfile module}"
+            uglifyjs $out/${module}.${extension} --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/${module}.min.${extension}
+          ''}
+        '') targets)}
+      '';
+    };
+  mainDotElm = mkDerivation {
+    name = "elm-app-0.1.0";
+    srcs = ./elm-srcs.nix;
+    src = ./.;
+    targets = ["Main"];
+    srcdir = "./src";
+    outputJavaScript = true;
+  };
+in stdenv.mkDerivation {
   name = "learn-piano-chords";
+  buildInputs = [];
   src = ./.;
-  buildInputs = with pkgs; [
-    elmPackages.elm
-    nodejs
-  ];
-  outputHashMode = "recursive";
-  outputHashAlgo = "sha256";
-  outputHash = "0diya7q8ird56jsbf2p49fyvldsay6m9z251zr2rq1i4qs7idy0j";
-  phases = [ "unpackPhase" "buildPhase" ];
   buildPhase = ''
-    export NIX_REDIRECTS=/etc/protocols=${pkgs.iana-etc}/etc/protocols
-    export LD_PRELOAD=${pkgs.libredirect}/lib/libredirect.so
-    export SYSTEM_CERTIFICATE_PATH=${pkgs.cacert}/etc/ssl/certs
-
     mkdir -p $out
-    cp index.html $out
-    elm make src/Main.elm --optimize --output=$out/elm.js
-    npx tailwindcss build index.css -o $out/output.css
+    cp index.html output.css ${mainDotElm}/Main.min.js $out
   '';
+  dontInstall = true;
 }