git.iko.soy/ghcjs-optimizer
on main help sign in
ghcjs-optimizer/default.nix
69 lines 2.0 kB history raw
1{ pkgs ? null
2, closurecompiler ? pkgs.closurecompiler
3, zopfli ? pkgs.zopfli
4, fileExtentionsToZopfli ? [ "js" "css" "json" "html" ]
5, jsToOptimize ? [ ]
6, filesToCopy ? { "" = "*"; }
7, copyInsteadOfOptimizeJs ? false
8}:
9input:
10let
11 flattenDirAttrSet' = prfx: x:
12 with builtins;
13 if isAttrs x
14 then concatLists (pkgs.lib.mapAttrsToList (p: v: flattenDirAttrSet' (prfx + "/" + p) v) x)
15 else [{ p = prfx; v = x; }];
16 flattenDirAttrSet = name: x:
17 if builtins.isAttrs x
18 then (flattenDirAttrSet' "" x)
19 else builtins.throw "${name} should be an attribute set.";
22 flattenFileTree = name: x: builtins.map ({ p, v }: p + "/" + v) (flattenDirAttrSet name x);
24 filesToList = name: x:
25 if builtins.isAttrs x
26 then flattenFileTree x
27 else if builtins.isList x
28 then x
29 else builtins.throw "${name} should be either a list or an attribute set.";
30 jsToOptimizeList = flattenDirAttrSet "jsToOptimize" jsToOptimize;
31in
32pkgs.runCommand "${input.name}-optimized"
33{ } ''
35 cd ${input}
36 shopt -s globstar
37 mkdir $out
39 chmod +w -R $out
41 ${
42 builtins.concatStringsSep "\n"
43 (builtins.map ({p, v}: "cp -afv ${v} $out${p}")
44 (flattenDirAttrSet "filesToCopy" filesToCopy ++
45 pkgs.lib.optionals copyInsteadOfOptimizeJs jsToOptimizeList))
46 }
48 chmod +w -R $out
50 ${
51 pkgs.lib.optionalString (!copyInsteadOfOptimizeJs)
52 (builtins.concatStringsSep "\n"
53 (builtins.map ({p, v}:
54 let
55 i = v;
56 o = p;
57 in ''
58 rm -f $out${o}
59 ${closurecompiler}/bin/closure-compiler --compilation_level ADVANCED --jscomp_off=checkVars --warning_level QUIET --js ${input}/${i} --externs ${input}/${i}.externs --js_output_file $out${o}
60 '')
61 (jsToOptimizeList)))
62 }
64 ${
65 if fileExtentionsToZopfli != []
66 then "${zopfli}/bin/zopfli $out/**/*.{${builtins.concatStringsSep "\n" fileExtentionsToZopfli}}"
67 else ""
68 }
69 ''