9 # arguments to `nix-build`, e.g. `"foo.nix -A bar"`
11 # what path to open a browser at
15 inherit (nodejs_latest.pkgs) live-server;
17 error-page = writeShellScriptBin "error-page" ''
23 @media (prefers-color-scheme: dark) {
24 :root { filter: invert(100%); }
28 <body><pre>$1</pre></body>
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
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" ''
46 stderr=$(2>&1 nix-build --out-link $out_link ${buildArgs})
50 if [ $exit_status -eq 0 ];
52 # setting permissions to be able to clean up
62 ${lib.getExe error-page} "$stderr" > $error_page_absolute
65 ${lib.getExe findutils} $serve \
67 ! -name $error_page_relative \
72 # https://watchexec.github.io/
73 watcher = writeShellScriptBin "watcher" ''
76 ${lib.getExe watchexec} \
80 ${lib.getExe build-and-copy}
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" ''
89 ${lib.getExe' live-server "live-server"} \
93 --entry-file=$error_page_relative \
98 writeShellScriptBin "devmode" ''
101 function handle_exit {
106 trap handle_exit EXIT
108 export out_link="$tmpdir/result"
109 export serve="$tmpdir/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} \
120 "${lib.getExe watcher}" \
121 "${lib.getExe server}"