electron_32: fix log spam when building on aarch64-linux (#378988)
[NixPkgs.git] / pkgs / by-name / de / devmode / package.nix
blobc3cf994df65e83f3b0c9836f2b36e626c2d429fd
2   lib,
3   findutils,
4   nodejs_latest,
5   parallel,
6   rsync,
7   watchexec,
8   writeShellScriptBin,
9   # arguments to `nix-build`, e.g. `"foo.nix -A bar"`
10   buildArgs ? "",
11   # what path to open a browser at
12   open ? "/index.html",
14 let
15   inherit (nodejs_latest.pkgs) live-server;
17   error-page = writeShellScriptBin "error-page" ''
18     cat << EOF
19     <!DOCTYPE html>
20     <html>
21     <head>
22       <style>
23         @media (prefers-color-scheme: dark) {
24           :root { filter: invert(100%); }
25         }
26       </style>
27     </head>
28     <body><pre>$1</pre></body>
29     </html>
30     EOF
31   '';
33   # The following would have been simpler:
34   # 1. serve from `$serve`
35   # 2. pass each build a `--out-link $serve/result`
36   # But that way live-server does not seem to detect changes and therefore no
37   # auto-reloads occur.
38   # Instead, we copy the contents of each build to the `$serve` directory.
39   # Using rsync here, instead of `cp`, to get as close to an atomic
40   # directory copy operation as possible. `--delay-updates` should
41   # also go towards that.
42   build-and-copy = writeShellScriptBin "build-and-copy" ''
43     set -euxo pipefail
45     set +e
46     stderr=$(2>&1 nix-build --out-link $out_link ${buildArgs})
47     exit_status=$?
48     set -e
50     if [ $exit_status -eq 0 ];
51     then
52       # setting permissions to be able to clean up
53       ${lib.getExe rsync} \
54         --recursive \
55         --chmod=u=rwX \
56         --delete-before \
57         --delay-updates \
58         $out_link/ \
59         $serve/
60     else
61       set +x
62       ${lib.getExe error-page} "$stderr" > $error_page_absolute
63       set -x
65       ${lib.getExe findutils} $serve \
66         -type f \
67         ! -name $error_page_relative \
68         -delete
69     fi
70   '';
72   # https://watchexec.github.io/
73   watcher = writeShellScriptBin "watcher" ''
74     set -euxo pipefail
76     ${lib.getExe watchexec} \
77       --shell=none \
78       --restart \
79       --print-events \
80       ${lib.getExe build-and-copy}
81   '';
83   # A Rust alternative to live-server exists, but it fails to open the temporary directory.
84   # `--no-css-inject`: without this it seems that only CSS is auto-reloaded.
85   # https://www.npmjs.com/package/live-server
86   server = writeShellScriptBin "server" ''
87     set -euxo pipefail
89     ${lib.getExe' live-server "live-server"} \
90       --host=127.0.0.1 \
91       --verbose \
92       --no-css-inject \
93       --entry-file=$error_page_relative \
94       --open=${open} \
95       $serve
96   '';
98 writeShellScriptBin "devmode" ''
99   set -euxo pipefail
101   function handle_exit {
102     rm -rf "$tmpdir"
103   }
105   tmpdir=$(mktemp -d)
106   trap handle_exit EXIT
108   export out_link="$tmpdir/result"
109   export serve="$tmpdir/serve"
110   mkdir $serve
111   export error_page_relative=error.html
112   export error_page_absolute=$serve/$error_page_relative
113   ${lib.getExe error-page} "building …" > $error_page_absolute
115   ${lib.getExe parallel} \
116     --will-cite \
117     --line-buffer \
118     --tagstr '{/}' \
119     ::: \
120     "${lib.getExe watcher}" \
121     "${lib.getExe server}"