Files
nixpkgs/pkgs/build-support/compress-drv/web.nix
İlkecan Bozdoğan e394a579b0 lib: update type signatures
- concrete types start with uppercase: Int, String, Bool, Derivation,
  etc.
- type variables start with lowercase: a, b, etc.
- list:
  - use `[x]` for homogeneous lists instead of `List x` or `[ x ]`
  - use `List` for heterogeneous lists (not that common in `lib`)
- attr:
  - use `AttrSet` for a generic attribute set type
  - use `{ key1 :: Type1; key2 :: Type2; ... }` for adding signatures
    for known attribute names and types
  - use `{ key1 = value1; key2 = value2; ... }` for adding attributes
    with known literals
  - end with an ellipsis (`...`) if the set can contain unknown
    attributes
  - use `{ [String] :: x }` if all the attributes has the same type `x`
- prefer `Any` over `a` if the latter is not reused
2026-03-04 00:10:00 +03:00

146 lines
3.9 KiB
Nix

{
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;
}