Skip to content

Commit

Permalink
Merge pull request #1923 from alexlamsl/harmony-v3.0.4
Browse files Browse the repository at this point in the history
Merging from master for 3.0.4
  • Loading branch information
alexlamsl authored May 11, 2017
2 parents c699200 + daf44f2 commit 945ba64
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 44 deletions.
87 changes: 46 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,16 +146,21 @@ 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`).

Additionally you might need `--source-map root=<URL>` to pass the URL where
the original files can be found. Use `--source-map url=<URL>` to specify
the URL where the source map can be found.
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.
Otherwise UglifyJS assumes HTTP `X-SourceMap` is being used and will omit the
`//# sourceMappingURL=` directive.

- `--source-map url=<URL>` to specify the URL where the source map can be found.

For example:

uglifyjs /home/doe/work/foo/src/js/file1.js \
/home/doe/work/foo/src/js/file2.js \
uglifyjs js/file1.js js/file2.js \
-o foo.min.js -c -m \
--source-map base="/home/doe/work/foo/src",root="http://foo.com/src"
--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
Expand All @@ -174,11 +179,9 @@ CoffeeScript → compiled JS, UglifyJS can generate a map from CoffeeScript →
compressed JS by mapping every token in the compiled JS to its original
location.

To use this feature you need to pass `--in-source-map
/path/to/input/source.map` or `--in-source-map inline` if the source map is
included inline with the sources. Normally the input source map should also
point to the file containing the generated JS, so if that's correct you can
omit input files from the command line.
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.

## Mangler options

Expand Down Expand Up @@ -461,7 +464,7 @@ You can also use conditional compilation via the programmatic API. With the diff
property name is `global_defs` and is a compressor property:

```js
uglifyJS.minify([ "input.js"], {
uglifyJS.minify(fs.readFileSync("input.js", "utf8"), {
compress: {
dead_code: true,
global_defs: {
Expand Down Expand Up @@ -670,45 +673,47 @@ Other options:

##### mangle

- `reserved` - pass an array of identifiers that should be excluded from mangling
- `reserved` - pass an array of identifiers that should be excluded from mangling

- `toplevel` — mangle names declared in the toplevel scope (disabled by
default).
- `toplevel` — mangle names declared in the toplevel scope (disabled by
default).

- `eval` — mangle names visible in scopes where eval or with are used
(disabled by default).
- `eval` — mangle names visible in scopes where eval or with are used
(disabled by default).

- `keep_fnames` -- default `false`. Pass `true` to not mangle
function names. Useful for code relying on `Function.prototype.name`.
See also: the `keep_fnames` [compress option](#compressor-options).
- `keep_fnames` -- default `false`. Pass `true` to not mangle
function names. Useful for code relying on `Function.prototype.name`.
See also: the `keep_fnames` [compress option](#compressor-options).

Examples:
Examples:

```javascript
//tst.js
var globalVar;
function funcName(firstLongName, anotherLongName)
{
```javascript
// test.js
var globalVar;
function funcName(firstLongName, anotherLongName)
{
var myVariable = firstLongName + anotherLongName;
}
}
```
```javascript
var code = fs.readFileSync("test.js", "utf8");

UglifyJS.minify("tst.js").code;
// 'function funcName(a,n){}var globalVar;'
UglifyJS.minify(code).code;
// 'function funcName(a,n){}var globalVar;'

UglifyJS.minify("tst.js", { mangle: { reserved: ['firstLongName'] } }).code;
// 'function funcName(firstLongName,a){}var globalVar;'
UglifyJS.minify(code, { mangle: { reserved: ['firstLongName'] } }).code;
// 'function funcName(firstLongName,a){}var globalVar;'

UglifyJS.minify("tst.js", { mangle: { toplevel: true } }).code;
// 'function n(n,a){}var a;'
```
UglifyJS.minify(code, { mangle: { toplevel: true } }).code;
// 'function n(n,a){}var a;'
```

##### mangle.properties options

- `regex` — Pass a RegExp to only mangle certain names
- `keep_quoted` — Only mangle unquoted property names
- `debug` — Mangle names with the original name still present. Defaults to `false`.
Pass an empty string to enable, or a non-empty string to set the suffix.

[acorn]: https://github.com/ternjs/acorn
[sm-spec]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k
- `regex` — Pass a RegExp to only mangle certain names
- `keep_quoted` — Only mangle unquoted property names
- `debug` — Mangle names with the original name still present. Defaults to `false`.
Pass an empty string to enable, or a non-empty string to set the suffix.

[acorn]: https://github.com/ternjs/acorn
[sm-spec]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k
14 changes: 12 additions & 2 deletions lib/compress.js
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,14 @@ merge(Compressor.prototype, {
return lhs instanceof AST_SymbolRef && lhs.definition().orig[0] instanceof AST_SymbolLambda;
}

function is_reference_const(ref) {
if (!(ref instanceof AST_SymbolRef)) return false;
var orig = ref.definition().orig;
for (var i = orig.length; --i >= 0;) {
if (orig[i] instanceof AST_SymbolConst) return true;
}
}

function find_variable(compressor, name) {
var scope, i = 0;
while (scope = compressor.parent(i++)) {
Expand Down Expand Up @@ -806,7 +814,8 @@ merge(Compressor.prototype, {
return make_node(AST_SymbolRef, expr.name, expr.name);
}
} else {
return expr[expr instanceof AST_Assign ? "left" : "expression"];
var lhs = expr[expr instanceof AST_Assign ? "left" : "expression"];
return !is_reference_const(lhs) && lhs;
}
}

Expand Down Expand Up @@ -2029,6 +2038,7 @@ merge(Compressor.prototype, {
&& node instanceof AST_Assign
&& node.operator == "="
&& node.left instanceof AST_SymbolRef
&& !is_reference_const(node.left)
&& scope === self) {
node.right.walk(tw);
return true;
Expand Down Expand Up @@ -3314,7 +3324,7 @@ merge(Compressor.prototype, {
&& (left.operator == "++" || left.operator == "--")) {
left = left.expression;
} else left = null;
if (!left || is_lhs_read_only(left)) {
if (!left || is_lhs_read_only(left) || is_reference_const(left)) {
expressions[++i] = cdr;
continue;
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"homepage": "http://lisperator.net/uglifyjs",
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
"license": "BSD-2-Clause",
"version": "3.0.3",
"version": "3.0.4",
"engines": {
"node": ">=0.8.0"
},
Expand Down
46 changes: 46 additions & 0 deletions test/compress/collapse_vars.js
Original file line number Diff line number Diff line change
Expand Up @@ -2284,3 +2284,49 @@ compound_assignment: {
}
expect_stdout: "4"
}

reassign_const_1: {
options = {
collapse_vars: true,
}
input: {
function f() {
const a = 1;
a = 2;
return a;
}
console.log(f());
}
expect: {
function f() {
const a = 1;
a = 2;
return a;
}
console.log(f());
}
expect_stdout: true
}

reassign_const_2: {
options = {
collapse_vars: true,
}
input: {
function f() {
const a = 1;
++a;
return a;
}
console.log(f());
}
expect: {
function f() {
const a = 1;
++a;
return a;
}
console.log(f());
}
expect_stdout: true
}
25 changes: 25 additions & 0 deletions test/compress/drop-unused.js
Original file line number Diff line number Diff line change
Expand Up @@ -1228,3 +1228,28 @@ var_catch_toplevel: {
}();
}
}

reassign_const: {
options = {
cascade: true,
sequences: true,
side_effects: true,
unused: true,
}
input: {
function f() {
const a = 1;
a = 2;
return a;
}
console.log(f());
}
expect: {
function f() {
const a = 1;
return a = 2, a;
}
console.log(f());
}
expect_stdout: true
}
24 changes: 24 additions & 0 deletions test/compress/sequences.js
Original file line number Diff line number Diff line change
Expand Up @@ -710,3 +710,27 @@ issue_27: {
})(jQuery);
}
}

reassign_const: {
options = {
cascade: true,
sequences: true,
side_effects: true,
}
input: {
function f() {
const a = 1;
a++;
return a;
}
console.log(f());
}
expect: {
function f() {
const a = 1;
return a++, a;
}
console.log(f());
}
expect_stdout: true
}

0 comments on commit 945ba64

Please sign in to comment.