{ brotli, compressDrv, lib, zopfli, zstd, }: /** compressDrvWeb compresses a derivation for common web server use. Useful when one wants to pre-compress certain static assets and pass them to the web server. # Inputs `formats` ([String]) : List of file extensions to compress. Defaults to common formats that compress well. `extraFindOperands` (String) : See compressDrv for details. `extraFormats` ([ String ]) : Extra extensions to compress in addition to `formats`. `compressors` ( { ${fileExtension} :: String }) : Map a desired extension (e.g. `gz`) to a compress program. # Type ``` compressDrvWeb :: Derivation -> { formats :: [ String ]; extraFormats :: [ String ]; compressors :: { ${fileExtension} :: String; } } -> Derivation ``` # Examples :::{.example} ## `pkgs.compressDrvWeb` full usage example with `pkgs.gamja` and a webserver ```nix For example, building `pkgs.gamja` produces the following output: /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/ ├── index.2fd01148.js ├── index.2fd01148.js.map ├── index.37aa9a8a.css ├── index.37aa9a8a.css.map ├── index.html └── manifest.webmanifest With `pkgs.compressDrvWeb`, one can compress these files: ```nix pkgs.compressDrvWeb pkgs.gamja {} => «derivation /nix/store/...-gamja-compressed.drv» ``` ```bash /nix/store/f5ryid7zrw2hid7h9kil5g5j29q5r2f7-gamja-1.0.0-beta.9-compressed ├── index.2fd01148.js -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.2fd01148.js ├── index.2fd01148.js.br ├── index.2fd01148.js.gz ├── index.2fd01148.js.map -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.2fd01148.js.map ├── index.2fd01148.js.map.br ├── index.2fd01148.js.map.gz ├── index.37aa9a8a.css -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.37aa9a8a.css ├── index.37aa9a8a.css.br ├── index.37aa9a8a.css.gz ├── index.37aa9a8a.css.map -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.37aa9a8a.css.map ├── index.37aa9a8a.css.map.br ├── index.37aa9a8a.css.map.gz ├── index.html -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.html ├── index.html.br ├── index.html.gz ├── manifest.webmanifest -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/manifest.webmanifest ├── manifest.webmanifest.br └── manifest.webmanifest.gz ``` When the `-compressed` derivation is passed to a properly configured web server, it enables direct serving of the pre-compressed files. ```shell-session $ curl -I -H 'Accept-Encoding: br' https://irc.example.org/ <...> content-encoding: br <...> ``` For example, a caddy configuration snippet for gamja to serve the static assets (JS, CSS files) pre-compressed: ```nix { virtualHosts."irc.example.org".extraConfig = '' root * ${pkgs.compressDrvWeb pkgs.gamja {}} file_server browse { precompressed br gzip } ''; } ``` This feature is also available in nginx via `ngx_brotli` and `ngx_http_gzip_static_module`. ::: */ drv: { formats ? [ "css" "eot" "htm" "html" "js" "json" "map" "otf" "svg" "ttf" "txt" "webmanifest" "xml" ], extraFormats ? [ ], compressors ? { br = "${lib.getExe brotli} --keep --no-copy-stat {}"; gz = "${lib.getExe zopfli} --keep {}"; # --force is required to not fail on symlinks # for details on the compression level see # https://github.com/NixOS/nixpkgs/pull/332752#issuecomment-2275110390 zstd = "${lib.getExe zstd} --force --keep --quiet -19 {}"; }, extraFindOperands ? "", }: compressDrv drv { formats = formats ++ extraFormats; compressors = compressors; inherit extraFindOperands; }