MCPcopy Index your code
hub / github.com/terser/terser

github.com/terser/terser @v5.48.0

repository ↗ · DeepWiki ↗ · release v5.48.0 ↗ · + Follow
1,991 symbols 5,278 edges 285 files 26 documented · 1% 86 cross-repo links
README

Terser

NPM Version NPM Downloads CI pipeline Opencollective financial contributors

A JavaScript mangler/compressor toolkit for ES6+.

note: You can support this project on patreon: [link] The Terser Patreon is shutting down in favor of opencollective. Check out PATRONS.md for our first-tier patrons.

Terser recommends you use RollupJS to bundle your modules, as that produces smaller code overall.

Beautification has been undocumented and is being removed from terser, we recommend you use prettier.

Find the changelog in CHANGELOG.md

Why choose terser?

uglify-es is no longer maintained and uglify-js does not support ES6+.

terser is a fork of uglify-es that mostly retains API and CLI compatibility with uglify-es and uglify-js@3.

Install

First make sure you have installed the latest version of node.js (You may need to restart your computer after this step).

From NPM for use as a command line app:

npm install terser -g

From NPM for programmatic use:

npm install terser

Command line usage

terser [input files] [options]

Terser can take multiple input files. It's recommended that you pass the input files first, then pass the options. Terser will parse input files in sequence and apply any compression options. The files are parsed in the same global scope, that is, a reference from a file to some variable/function declared in another file will be matched properly.

Command line arguments that take options (like --parse, --compress, --mangle and --format) can take in a comma-separated list of default option overrides. For instance:

terser input.js --compress ecma=2015,computed_props=false

If no input file is specified, Terser will read from STDIN.

If you wish to pass your options before the input files, separate the two with a double dash to prevent input files being used as option arguments:

terser --compress --mangle -- input.js

Command line options

    -h, --help                  Print usage information.
                                `--help options` for details on available options.
    -V, --version               Print version number.
    -p, --parse <options>       Specify parser options:
                                `acorn`  Use Acorn for parsing.
                                `bare_returns`  Allow return outside of functions.
                                                Useful when minifying CommonJS
                                                modules and Userscripts that may
                                                be anonymous function wrapped (IIFE)
                                                by the .user.js engine `caller`.
                                `expression`  Parse a single expression, rather than
                                              a program (for parsing JSON).
                                `spidermonkey`  Assume input files are SpiderMonkey
                                                AST format (as JSON).
    -c, --compress [options]    Enable compressor/specify compressor options:
                                `pure_funcs`  List of functions that can be safely
                                              removed when their return values are
                                              not used.
    -m, --mangle [options]      Mangle names/specify mangler options:
                                `reserved`  List of names that should not be mangled.
    --mangle-props [options]    Mangle properties/specify mangler options:
                                `builtins`  Mangle property names that overlaps
                                            with standard JavaScript globals and DOM
                                            API props.
                                `debug`  Add debug prefix and suffix.
                                `keep_quoted`  Only mangle unquoted properties, quoted
                                               properties are automatically reserved.
                                               `strict` disables quoted properties
                                               being automatically reserved.
                                `regex`  Only mangle matched property names.
                                `only_annotated` Only mangle properties defined with /*@__MANGLE_PROP__*/.
                                `reserved`  List of names that should not be mangled.
    -f, --format [options]      Specify format options.
                                `preamble`  Preamble to prepend to the output. You
                                            can use this to insert a comment, for
                                            example for licensing information.
                                            This will not be parsed, but the source
                                            map will adjust for its presence.
                                `quote_style`  Quote style:
                                               0 - auto
                                               1 - single
                                               2 - double
                                               3 - original
                                `wrap_iife`  Wrap IIFEs in parenthesis. Note: you may
                                             want to disable `negate_iife` under
                                             compressor options.
                                `wrap_func_args`  Wrap function arguments in parenthesis.
    -o, --output <file>         Output file path (default STDOUT). Specify `ast` or
                                `spidermonkey` to write Terser or SpiderMonkey AST
                                as JSON to STDOUT respectively.
    --comments [filter]         Preserve copyright comments in the output. By
                                default this works like Google Closure, keeping
                                JSDoc-style comments that contain e.g. "@license",
                                or start with "!". You can optionally pass one of the
                                following arguments to this flag:
                                - "all" to keep all comments
                                - `false` to omit comments in the output
                                - a valid JS RegExp like `/foo/` or `/^!/` to
                                keep only matching comments.
                                Note that currently not *all* comments can be
                                kept when compression is on, because of dead
                                code removal or cascading statements into
                                sequences.
    --config-file <file>        Read `minify()` options from JSON file.
    -d, --define <expr>[=value] Global definitions.
    --ecma <version>            Specify ECMAScript release: 5, 2015, 2016, etc.
    -e, --enclose [arg[:value]] Embed output in a big function with configurable
                                arguments and values.
    --ie8                       Support non-standard Internet Explorer 8.
                                Equivalent to setting `ie8: true` in `minify()`
                                for `compress`, `mangle` and `format` options.
                                By default Terser will not try to be IE-proof.
    --keep-classnames           Do not mangle/drop class names.
    --keep-fnames               Do not mangle/drop function names.  Useful for
                                code relying on Function.prototype.name.
    --module                    Input is an ES6 module. If `compress` or `mangle` is
                                enabled then the `toplevel` option, as well as strict mode,
                                will be enabled.
    --name-cache <file>         File to hold mangled name mappings.
    --safari10                  Support non-standard Safari 10/11.
                                Equivalent to setting `safari10: true` in `minify()`
                                for `mangle` and `format` options.
                                By default `terser` will not work around
                                Safari 10/11 bugs.
    --source-map [options]      Enable source map/specify source map options:
                                `base`  Path to compute relative paths from input files.
                                `content`  Input source map, useful if you're compressing
                                           JS that was generated from some other original
                                           code. Specify "inline" if the source map is
                                           included within the sources.
                                `filename`  Name and/or location of the output source.
                                `includeSources`  Pass this flag if you want to include
                                                  the content of source files in the
                                                  source map as sourcesContent property.
                                `root`  Path to the original source to be included in
                                        the source map.
                                `url`  If specified, path to the source map to append in
                                       `//# sourceMappingURL`.
    --timings                   Display operations run time on STDERR.
    --toplevel                  Compress and/or mangle variables in top level scope.
    --wrap <name>               Embed everything in a big function, making the
                                “exports” and “global” variables available. You
                                need to pass an argument to this option to
                                specify the name that your module will take
                                when included in, say, a browser.

Specify --output (-o) to declare the output file. Otherwise the output goes to STDOUT.

CLI source map options

Terser can generate a source map file, which is highly useful for debugging your compressed JavaScript. To get a source map, pass --source-map --output output.js (source map will be written out to output.js.map).

Additional options:

  • --source-map "filename='<NAME>'" to specify the name of the source map.

  • --source-map "root='<URL>'" to pass the URL where the original files can be found.

  • --source-map "url='<URL>'" to specify the URL where the source map can be found. Otherwise Terser assumes HTTP X-SourceMap is being used and will omit the //# sourceMappingURL= directive.

For example:

terser js/file1.js js/file2.js \
         -o foo.min.js -c -m \
         --source-map "root='http://foo.com/src',url='foo.min.js.map'"

The above will compress and mangle file1.js and file2.js, will drop the output in foo.min.js and the source map in foo.min.js.map. The source mapping will refer to http://foo.com/src/js/file1.js and http://foo.com/src/js/file2.js (in fact it will list http://foo.com/src as the source map root, and the original files as js/file1.js and js/file2.js).

Composed source map

When you're compressing JS code that was output by a compiler such as CoffeeScript, mapping to the JS code won't be too helpful. Instead, you'd like to map back to the original code (i.e. CoffeeScript). Terser has an option to take an input source map. Assuming you have a mapping from CoffeeScript → compiled JS, Terser can generate a map from CoffeeScript → compressed JS by mapping every token in the compiled JS to its original location.

To use this feature pass --source-map "content='/path/to/input/source.map'" or --source-map "content=inline" if the source map is included inline with the sources.

CLI compress options

You need to pass --compress (-c) to enable the compressor. Optionally you can pass a comma-separated list of compress options.

Options are in the form foo=bar, or just foo (the latter implies a boolean option that you want to set true; it's effectively a shortcut for foo=true).

Example:

terser file.js -c toplevel,sequences=false

CLI mangle options

To enable the mangler you need to pass --mangle (-m). The following (comma-separated) options are supported:

  • toplevel (default false) -- mangle names declared in the top level scope.

  • eval (default false) -- mangle names visible in scopes where eval or with are used.

When mangling is enabled but you want to prevent certain names from being mangled, you can declare those names with --mangle reserved — pass a comma-separated list of names. For example:

terser ... -m reserved=['$','require','exports']

to prevent the require, exports and $ names from being changed.

CLI mangling property names (--mangle-props)

Note: THIS WILL BREAK YOUR CODE. A good rule of thumb is not to use this unless you know exactly what you're doing and

Extension points exported contracts — how you extend this code

ParseOptions (Interface)
(no doc)
tools/terser.d.ts
CompressOptions (Interface)
(no doc)
tools/terser.d.ts
MangleOptions (Interface)
(no doc)
tools/terser.d.ts
SimpleIdentifierMangler (Interface)
(no doc)
tools/terser.d.ts
WeightedIdentifierMangler (Interface)
(no doc)
tools/terser.d.ts

Core symbols most depended-on inside this repo

log
called by 4040
test/compress/class-properties.js
make_node
called by 309
lib/utils/index.js
push
called by 273
lib/ast.js
print
called by 234
test/compress/classes.js
baz
called by 203
test/compress/arrow.js
bar
called by 188
test/compress/const.js
option
called by 180
lib/compress/index.js
id
called by 171
test/compress/identity.js

Shape

Function 1,433
Class 301
Method 245
Interface 10
Enum 2

Languages

TypeScript100%

Modules by API surface

lib/parse.js141 symbols
test/compress/harmony.js110 symbols
test/compress/object.js94 symbols
test/compress/collapse_vars.js84 symbols
test/compress/drop-unused.js83 symbols
test/compress/reduce_vars.js73 symbols
test/input/spidermonkey/input.js58 symbols
lib/compress/index.js50 symbols
test/compress/export.js49 symbols
lib/output.js49 symbols
lib/compress/tighten-body.js44 symbols
test/ufuzz.js41 symbols

Dependencies from manifests, versioned

@ls-lint/ls-lint1.11.2 · 1×
acorn8.15.0 · 1×
astring1.8.5 · 1×
commander2.20.0 · 1×
eslint7.32.0 · 1×
eslump3.0.0 · 1×
esm3.2.25 · 1×
mocha9.2.0 · 1×
pre-commit1.2.2 · 1×
rollup2.79.2 · 1×
semver7.5.1 · 1×

For agents

$ claude mcp add terser \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact