blob: e2b6f14cfff16306500531d756cbbbd890290869 [file] [view]
---
title: Terser
layout: default
stylesheet: docs
---
<!-- *********************
DO NOT EDIT THIS FILE
It is a generated build output from Stardoc.
Instead you must edit the .bzl file where the rules are declared,
or possibly a markdown file next to the .bzl file
********************* -->
# Terser rules for Bazel
The Terser rules run the Terser JS minifier with Bazel.
Wraps the Terser CLI documented at https://github.com/terser-js/terser#command-line-usage
## Installation
Add the `@bazel/terser` npm package to your `devDependencies` in `package.json`.
Your `WORKSPACE` should declare a `yarn_install` or `npm_install` rule named `npm`.
It should then install the rules found in the npm packages using the `install_bazel_dependencies` function.
See https://github.com/bazelbuild/rules_nodejs/#quickstart
This causes the `@bazel/terser` package to be installed as a Bazel workspace named `npm_bazel_terser`.
## Installing with self-managed dependencies
If you didn't use the `yarn_install` or `npm_install` rule to create an `npm` workspace, you'll have to declare a rule in your root `BUILD.bazel` file to execute terser:
```python
# Create a terser rule to use in terser_minified#terser_bin
# attribute when using self-managed dependencies
nodejs_binary(
name = "terser_bin",
entry_point = "//:node_modules/terser/bin/uglifyjs",
# Point bazel to your node_modules to find the entry point
node_modules = ["//:node_modules"],
)
```
[name]: https://bazel.build/docs/build-ref.html#name
[label]: https://bazel.build/docs/build-ref.html#labels
[labels]: https://bazel.build/docs/build-ref.html#labels
## terser_minified
Run the terser minifier.
Typical example:
```python
load("@npm_bazel_terser//:index.bzl", "terser_minified")
terser_minified(
name = "out.min",
src = "input.js",
config_file = "terser_config.json",
)
```
Note that the `name` attribute determines what the resulting files will be called.
So the example above will output `out.min.js` and `out.min.js.map` (since `sourcemap` defaults to `true`).
If the input is a directory, then the output will also be a directory, named after the `name` attribute.
### Usage
```
terser_minified(name, args, config_file, debug, sourcemap, src, terser_bin)
```
#### `name`
(*[name], mandatory*): A unique name for this target.
#### `args`
(*List of strings*): Additional command line arguments to pass to terser.
Terser only parses minify() args from the config file so additional arguments such as `--comments` may
be passed to the rule using this attribute. See https://github.com/terser/terser#command-line-usage for the
full list of terser CLI options.
Defaults to `[]`
#### `config_file`
(*[label]*): A JSON file containing Terser minify() options.
This is the file you would pass to the --config-file argument in terser's CLI.
https://github.com/terser-js/terser#minify-options documents the content of the file.
Bazel will make a copy of your config file, treating it as a template.
> Run bazel with `--subcommands` to see the path to the copied file.
If you use the magic strings `"bazel_debug"` or `"bazel_no_debug"`, these will be
replaced with `true` and `false` respecting the value of the `debug` attribute
or the `--compilation_mode=dbg` bazel flag.
For example,
```
{
"compress": {
"arrows": "bazel_no_debug"
}
}
```
Will disable the `arrows` compression setting when debugging.
If `config_file` isn't supplied, Bazel will use a default config file.
Defaults to `@npm_bazel_terser//:terser_config.default.json`
#### `debug`
(*Boolean*): Configure terser to produce more readable output.
Instead of setting this attribute, consider using debugging compilation mode instead
bazel build --compilation_mode=dbg //my/terser:target
so that it only affects the current build.
Defaults to `False`
#### `sourcemap`
(*Boolean*): Whether to produce a .js.map output
Defaults to `True`
#### `src`
(*[label], mandatory*): File(s) to minify.
Can be a .js file, a rule producing .js files as its default output, or a rule producing a directory of .js files.
Note that you can pass multiple files to terser, which it will bundle together.
If you want to do this, you can pass a filegroup here.
#### `terser_bin`
(*[label]*): An executable target that runs Terser
Defaults to `@npm//@bazel/terser/bin:terser`