terser 5.12.0 → 5.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/bundle.min.js +5032 -3341
- package/lib/ast.js +1686 -350
- package/lib/compress/common.js +48 -0
- package/lib/compress/evaluate.js +4 -3
- package/lib/compress/index.js +23 -546
- package/lib/compress/inline.js +641 -0
- package/lib/compress/tighten-body.js +1 -1
- package/lib/equivalent-to.js +81 -107
- package/lib/mozilla-ast.js +474 -81
- package/lib/output.js +2 -1
- package/lib/parse.js +58 -56
- package/lib/propmangle.js +1 -1
- package/lib/scope.js +22 -0
- package/lib/size.js +6 -8
- package/package.json +2 -2
- package/tools/domprops.js +11 -0
package/lib/output.js
CHANGED
@@ -1098,7 +1098,8 @@ function OutputStream(options) {
|
|
1098
1098
|
var p = output.parent();
|
1099
1099
|
if (this.args.length === 0
|
1100
1100
|
&& (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]()
|
1101
|
-
|| p instanceof AST_Call && p.expression === this
|
1101
|
+
|| p instanceof AST_Call && p.expression === this
|
1102
|
+
|| p instanceof AST_PrefixedTemplateString && p.prefix === this)) // (new foo)(bar)
|
1102
1103
|
return true;
|
1103
1104
|
});
|
1104
1105
|
|
package/lib/parse.js
CHANGED
@@ -1572,66 +1572,66 @@ function parse($TEXT, options) {
|
|
1572
1572
|
});
|
1573
1573
|
};
|
1574
1574
|
|
1575
|
-
|
1576
|
-
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1580
|
-
|
1581
|
-
|
1582
|
-
|
1583
|
-
|
1584
|
-
|
1585
|
-
|
1586
|
-
|
1587
|
-
|
1588
|
-
|
1589
|
-
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1593
|
-
|
1594
|
-
|
1595
|
-
|
1596
|
-
|
1597
|
-
|
1598
|
-
|
1599
|
-
|
1600
|
-
|
1601
|
-
|
1602
|
-
|
1575
|
+
class UsedParametersTracker {
|
1576
|
+
constructor(is_parameter, strict, duplicates_ok = false) {
|
1577
|
+
this.is_parameter = is_parameter;
|
1578
|
+
this.duplicates_ok = duplicates_ok;
|
1579
|
+
this.parameters = new Set();
|
1580
|
+
this.duplicate = null;
|
1581
|
+
this.default_assignment = false;
|
1582
|
+
this.spread = false;
|
1583
|
+
this.strict_mode = !!strict;
|
1584
|
+
}
|
1585
|
+
add_parameter(token) {
|
1586
|
+
if (this.parameters.has(token.value)) {
|
1587
|
+
if (this.duplicate === null) {
|
1588
|
+
this.duplicate = token;
|
1589
|
+
}
|
1590
|
+
this.check_strict();
|
1591
|
+
} else {
|
1592
|
+
this.parameters.add(token.value);
|
1593
|
+
if (this.is_parameter) {
|
1594
|
+
switch (token.value) {
|
1595
|
+
case "arguments":
|
1596
|
+
case "eval":
|
1597
|
+
case "yield":
|
1598
|
+
if (this.strict_mode) {
|
1599
|
+
token_error(token, "Unexpected " + token.value + " identifier as parameter inside strict mode");
|
1600
|
+
}
|
1601
|
+
break;
|
1602
|
+
default:
|
1603
|
+
if (RESERVED_WORDS.has(token.value)) {
|
1604
|
+
unexpected();
|
1603
1605
|
}
|
1604
1606
|
}
|
1605
1607
|
}
|
1606
|
-
},
|
1607
|
-
mark_default_assignment: function(token) {
|
1608
|
-
if (default_assignment === false) {
|
1609
|
-
default_assignment = token;
|
1610
|
-
}
|
1611
|
-
},
|
1612
|
-
mark_spread: function(token) {
|
1613
|
-
if (spread === false) {
|
1614
|
-
spread = token;
|
1615
|
-
}
|
1616
|
-
},
|
1617
|
-
mark_strict_mode: function() {
|
1618
|
-
strict_mode = true;
|
1619
|
-
},
|
1620
|
-
is_strict: function() {
|
1621
|
-
return default_assignment !== false || spread !== false || strict_mode;
|
1622
|
-
},
|
1623
|
-
check_strict: function() {
|
1624
|
-
if (tracker.is_strict() && duplicate !== false) {
|
1625
|
-
token_error(duplicate, "Parameter " + duplicate.value + " was used already");
|
1626
|
-
}
|
1627
1608
|
}
|
1628
|
-
}
|
1629
|
-
|
1630
|
-
|
1609
|
+
}
|
1610
|
+
mark_default_assignment(token) {
|
1611
|
+
if (this.default_assignment === false) {
|
1612
|
+
this.default_assignment = token;
|
1613
|
+
}
|
1614
|
+
}
|
1615
|
+
mark_spread(token) {
|
1616
|
+
if (this.spread === false) {
|
1617
|
+
this.spread = token;
|
1618
|
+
}
|
1619
|
+
}
|
1620
|
+
mark_strict_mode() {
|
1621
|
+
this.strict_mode = true;
|
1622
|
+
}
|
1623
|
+
is_strict() {
|
1624
|
+
return this.default_assignment !== false || this.spread !== false || this.strict_mode;
|
1625
|
+
}
|
1626
|
+
check_strict() {
|
1627
|
+
if (this.is_strict() && this.duplicate !== null && !this.duplicates_ok) {
|
1628
|
+
token_error(this.duplicate, "Parameter " + this.duplicate.value + " was used already");
|
1629
|
+
}
|
1630
|
+
}
|
1631
1631
|
}
|
1632
1632
|
|
1633
1633
|
function parameters(params) {
|
1634
|
-
var used_parameters =
|
1634
|
+
var used_parameters = new UsedParametersTracker(true, S.input.has_directive("use strict"));
|
1635
1635
|
|
1636
1636
|
expect("(");
|
1637
1637
|
|
@@ -1655,7 +1655,7 @@ function parse($TEXT, options) {
|
|
1655
1655
|
var param;
|
1656
1656
|
var expand = false;
|
1657
1657
|
if (used_parameters === undefined) {
|
1658
|
-
used_parameters =
|
1658
|
+
used_parameters = new UsedParametersTracker(true, S.input.has_directive("use strict"));
|
1659
1659
|
}
|
1660
1660
|
if (is("expand", "...")) {
|
1661
1661
|
expand = S.token;
|
@@ -1698,7 +1698,9 @@ function parse($TEXT, options) {
|
|
1698
1698
|
var expand_token;
|
1699
1699
|
var first_token = S.token;
|
1700
1700
|
if (used_parameters === undefined) {
|
1701
|
-
|
1701
|
+
const strict = S.input.has_directive("use strict");
|
1702
|
+
const duplicates_ok = symbol_type === AST_SymbolVar;
|
1703
|
+
used_parameters = new UsedParametersTracker(false, strict, duplicates_ok);
|
1702
1704
|
}
|
1703
1705
|
symbol_type = symbol_type === undefined ? AST_SymbolFunarg : symbol_type;
|
1704
1706
|
if (is("punc", "[")) {
|
@@ -2091,7 +2093,7 @@ function parse($TEXT, options) {
|
|
2091
2093
|
if (is("punc", "{") || is("punc", "[")) {
|
2092
2094
|
def = new AST_VarDef({
|
2093
2095
|
start: S.token,
|
2094
|
-
name: binding_element(undefined
|
2096
|
+
name: binding_element(undefined, sym_type),
|
2095
2097
|
value: is("operator", "=") ? (expect_token("operator", "="), expression(false, no_in)) : null,
|
2096
2098
|
end: prev()
|
2097
2099
|
});
|
package/lib/propmangle.js
CHANGED
@@ -78,7 +78,7 @@ function find_builtins(reserved) {
|
|
78
78
|
var global_ref = typeof global === "object" ? global : self;
|
79
79
|
|
80
80
|
new_globals.forEach(function (new_global) {
|
81
|
-
objects[new_global] = global_ref[new_global] ||
|
81
|
+
objects[new_global] = global_ref[new_global] || function() {};
|
82
82
|
});
|
83
83
|
|
84
84
|
[
|
package/lib/scope.js
CHANGED
@@ -116,6 +116,11 @@ const MASK_EXPORT_WANT_MANGLE = 1 << 1;
|
|
116
116
|
|
117
117
|
let function_defs = null;
|
118
118
|
let unmangleable_names = null;
|
119
|
+
/**
|
120
|
+
* When defined, there is a function declaration somewhere that's inside of a block.
|
121
|
+
* See https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-block-level-function-declarations-web-legacy-compatibility-semantics
|
122
|
+
*/
|
123
|
+
let scopes_with_block_defuns = null;
|
119
124
|
|
120
125
|
class SymbolDef {
|
121
126
|
constructor(scope, orig, init) {
|
@@ -666,6 +671,15 @@ AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {
|
|
666
671
|
});
|
667
672
|
|
668
673
|
function next_mangled(scope, options) {
|
674
|
+
let defun_scope;
|
675
|
+
if (
|
676
|
+
scopes_with_block_defuns
|
677
|
+
&& (defun_scope = scope.get_defun_scope())
|
678
|
+
&& scopes_with_block_defuns.has(defun_scope)
|
679
|
+
) {
|
680
|
+
scope = defun_scope;
|
681
|
+
}
|
682
|
+
|
669
683
|
var ext = scope.enclosed;
|
670
684
|
var nth_identifier = options.nth_identifier;
|
671
685
|
out: while (true) {
|
@@ -800,6 +814,13 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|
800
814
|
lname = save_nesting;
|
801
815
|
return true; // don't descend again in TreeWalker
|
802
816
|
}
|
817
|
+
if (
|
818
|
+
node instanceof AST_Defun
|
819
|
+
&& !(tw.parent() instanceof AST_Scope)
|
820
|
+
) {
|
821
|
+
scopes_with_block_defuns = scopes_with_block_defuns || new Set();
|
822
|
+
scopes_with_block_defuns.add(node.parent_scope.get_defun_scope());
|
823
|
+
}
|
803
824
|
if (node instanceof AST_Scope) {
|
804
825
|
node.variables.forEach(collect);
|
805
826
|
return;
|
@@ -848,6 +869,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|
848
869
|
|
849
870
|
function_defs = null;
|
850
871
|
unmangleable_names = null;
|
872
|
+
scopes_with_block_defuns = null;
|
851
873
|
|
852
874
|
function collect(symbol) {
|
853
875
|
if (symbol.export & MASK_EXPORT_DONT_MANGLE) {
|
package/lib/size.js
CHANGED
@@ -115,6 +115,7 @@ AST_Directive.prototype._size = function () {
|
|
115
115
|
return 2 + this.value.length;
|
116
116
|
};
|
117
117
|
|
118
|
+
/** Count commas/semicolons necessary to show a list of expressions/statements */
|
118
119
|
const list_overhead = (array) => array.length && array.length - 1;
|
119
120
|
|
120
121
|
AST_Block.prototype._size = function () {
|
@@ -167,7 +168,7 @@ AST_Arrow.prototype._size = function () {
|
|
167
168
|
&& this.argnames[0] instanceof AST_Symbol
|
168
169
|
)
|
169
170
|
) {
|
170
|
-
args_and_arrow += 2;
|
171
|
+
args_and_arrow += 2; // parens around the args
|
171
172
|
}
|
172
173
|
|
173
174
|
const body_overhead = this.is_braceless() ? 0 : list_overhead(this.body) + 2;
|
@@ -229,19 +230,16 @@ AST_Finally.prototype._size = function () {
|
|
229
230
|
return 7 + list_overhead(this.body);
|
230
231
|
};
|
231
232
|
|
232
|
-
/*#__INLINE__*/
|
233
|
-
const def_size = (size, def) => size + list_overhead(def.definitions);
|
234
|
-
|
235
233
|
AST_Var.prototype._size = function () {
|
236
|
-
return
|
234
|
+
return 4 + list_overhead(this.definitions);
|
237
235
|
};
|
238
236
|
|
239
237
|
AST_Let.prototype._size = function () {
|
240
|
-
return
|
238
|
+
return 4 + list_overhead(this.definitions);
|
241
239
|
};
|
242
240
|
|
243
241
|
AST_Const.prototype._size = function () {
|
244
|
-
return
|
242
|
+
return 6 + list_overhead(this.definitions);
|
245
243
|
};
|
246
244
|
|
247
245
|
AST_VarDef.prototype._size = function () {
|
@@ -477,7 +475,7 @@ AST_NaN.prototype._size = () => 3;
|
|
477
475
|
|
478
476
|
AST_Undefined.prototype._size = () => 6; // "void 0"
|
479
477
|
|
480
|
-
AST_Hole.prototype._size = () => 0; // comma is taken into account
|
478
|
+
AST_Hole.prototype._size = () => 0; // comma is taken into account by list_overhead()
|
481
479
|
|
482
480
|
AST_Infinity.prototype._size = () => 8;
|
483
481
|
|
package/package.json
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
"homepage": "https://terser.org",
|
5
5
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
6
6
|
"license": "BSD-2-Clause",
|
7
|
-
"version": "5.
|
7
|
+
"version": "5.13.1",
|
8
8
|
"engines": {
|
9
9
|
"node": ">=10"
|
10
10
|
},
|
@@ -45,7 +45,7 @@
|
|
45
45
|
"dependencies": {
|
46
46
|
"acorn": "^8.5.0",
|
47
47
|
"commander": "^2.20.0",
|
48
|
-
"source-map": "~0.
|
48
|
+
"source-map": "~0.8.0-beta.0",
|
49
49
|
"source-map-support": "~0.5.20"
|
50
50
|
},
|
51
51
|
"devDependencies": {
|
package/tools/domprops.js
CHANGED
@@ -2979,6 +2979,7 @@ export var domprops = [
|
|
2979
2979
|
"applyElement",
|
2980
2980
|
"arc",
|
2981
2981
|
"arcTo",
|
2982
|
+
"architecture",
|
2982
2983
|
"archive",
|
2983
2984
|
"areas",
|
2984
2985
|
"arguments",
|
@@ -3153,6 +3154,7 @@ export var domprops = [
|
|
3153
3154
|
"bindTexture",
|
3154
3155
|
"bindTransformFeedback",
|
3155
3156
|
"bindVertexArray",
|
3157
|
+
"bitness",
|
3156
3158
|
"blendColor",
|
3157
3159
|
"blendEquation",
|
3158
3160
|
"blendEquationSeparate",
|
@@ -3314,6 +3316,8 @@ export var domprops = [
|
|
3314
3316
|
"boxDecorationBreak",
|
3315
3317
|
"boxShadow",
|
3316
3318
|
"boxSizing",
|
3319
|
+
"brand",
|
3320
|
+
"brands",
|
3317
3321
|
"break-after",
|
3318
3322
|
"break-before",
|
3319
3323
|
"break-inside",
|
@@ -4312,6 +4316,7 @@ export var domprops = [
|
|
4312
4316
|
"fround",
|
4313
4317
|
"fullPath",
|
4314
4318
|
"fullScreen",
|
4319
|
+
"fullVersionList",
|
4315
4320
|
"fullscreen",
|
4316
4321
|
"fullscreenElement",
|
4317
4322
|
"fullscreenEnabled",
|
@@ -4437,6 +4442,7 @@ export var domprops = [
|
|
4437
4442
|
"getFrequencyResponse",
|
4438
4443
|
"getFullYear",
|
4439
4444
|
"getGamepads",
|
4445
|
+
"getHighEntropyValues",
|
4440
4446
|
"getHitTestResults",
|
4441
4447
|
"getHitTestResultsForTransientInput",
|
4442
4448
|
"getHours",
|
@@ -5277,7 +5283,9 @@ export var domprops = [
|
|
5277
5283
|
"mix-blend-mode",
|
5278
5284
|
"mixBlendMode",
|
5279
5285
|
"mm",
|
5286
|
+
"mobile",
|
5280
5287
|
"mode",
|
5288
|
+
"model",
|
5281
5289
|
"modify",
|
5282
5290
|
"mount",
|
5283
5291
|
"move",
|
@@ -6183,6 +6191,7 @@ export var domprops = [
|
|
6183
6191
|
"placeItems",
|
6184
6192
|
"placeSelf",
|
6185
6193
|
"placeholder",
|
6194
|
+
"platformVersion",
|
6186
6195
|
"platform",
|
6187
6196
|
"platforms",
|
6188
6197
|
"play",
|
@@ -7421,6 +7430,7 @@ export var domprops = [
|
|
7421
7430
|
"user-select",
|
7422
7431
|
"userActivation",
|
7423
7432
|
"userAgent",
|
7433
|
+
"userAgentData",
|
7424
7434
|
"userChoice",
|
7425
7435
|
"userHandle",
|
7426
7436
|
"userHint",
|
@@ -7734,6 +7744,7 @@ export var domprops = [
|
|
7734
7744
|
"wordSpacing",
|
7735
7745
|
"wordWrap",
|
7736
7746
|
"workerStart",
|
7747
|
+
"wow64",
|
7737
7748
|
"wrap",
|
7738
7749
|
"wrapKey",
|
7739
7750
|
"writable",
|