terser 5.16.1 → 5.17.7
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 +80 -0
- package/README.md +19 -5
- package/dist/bundle.min.js +931 -459
- package/lib/ast.js +82 -9
- package/lib/compress/common.js +6 -3
- package/lib/compress/drop-side-effect-free.js +32 -20
- package/lib/compress/drop-unused.js +29 -30
- package/lib/compress/evaluate.js +20 -1
- package/lib/compress/index.js +63 -54
- package/lib/compress/inference.js +31 -3
- package/lib/compress/inline.js +119 -114
- package/lib/compress/native-objects.js +22 -0
- package/lib/compress/reduce-vars.js +111 -11
- package/lib/compress/tighten-body.js +61 -21
- package/lib/equivalent-to.js +1 -1
- package/lib/minify.js +23 -17
- package/lib/mozilla-ast.js +119 -41
- package/lib/output.js +98 -44
- package/lib/parse.js +78 -19
- package/lib/propmangle.js +11 -0
- package/lib/scope.js +5 -9
- package/lib/size.js +1 -3
- package/lib/transform.js +4 -10
- package/lib/utils/index.js +24 -39
- package/package.json +8 -9
- package/tools/domprops.js +3 -0
- package/tools/terser.d.ts +1 -0
- package/bin/terser.mjs +0 -21
package/lib/parse.js
CHANGED
@@ -152,6 +152,7 @@ import {
|
|
152
152
|
AST_Toplevel,
|
153
153
|
AST_True,
|
154
154
|
AST_Try,
|
155
|
+
AST_TryBlock,
|
155
156
|
AST_UnaryPostfix,
|
156
157
|
AST_UnaryPrefix,
|
157
158
|
AST_Var,
|
@@ -161,7 +162,8 @@ import {
|
|
161
162
|
AST_Yield,
|
162
163
|
_INLINE,
|
163
164
|
_NOINLINE,
|
164
|
-
_PURE
|
165
|
+
_PURE,
|
166
|
+
_KEY
|
165
167
|
} from "./ast.js";
|
166
168
|
|
167
169
|
var LATEST_RAW = ""; // Only used for numbers and template strings
|
@@ -260,6 +262,19 @@ var UNICODE = {
|
|
260
262
|
ID_Continue: /(?:[$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF])+/,
|
261
263
|
};
|
262
264
|
|
265
|
+
try {
|
266
|
+
UNICODE = {
|
267
|
+
// https://262.ecma-international.org/13.0/#prod-IdentifierStartChar
|
268
|
+
// $, _, ID_Start
|
269
|
+
ID_Start: new RegExp("[_$\\p{ID_Start}]", "u"),
|
270
|
+
// https://262.ecma-international.org/13.0/#prod-IdentifierPartChar
|
271
|
+
// $, zero-width-joiner, zero-width-non-joiner, ID_Continue
|
272
|
+
ID_Continue: new RegExp("[$\\u200C\\u200D\\p{ID_Continue}]+", "u"),
|
273
|
+
};
|
274
|
+
} catch(e) {
|
275
|
+
// Could not use modern JS \p{...}. UNICODE is already defined above so let's continue
|
276
|
+
}
|
277
|
+
|
263
278
|
function get_full_char(str, pos) {
|
264
279
|
if (is_surrogate_pair_head(str.charCodeAt(pos))) {
|
265
280
|
if (is_surrogate_pair_tail(str.charCodeAt(pos + 1))) {
|
@@ -2053,7 +2068,12 @@ function parse($TEXT, options) {
|
|
2053
2068
|
}
|
2054
2069
|
|
2055
2070
|
function try_() {
|
2056
|
-
var body
|
2071
|
+
var body, bcatch = null, bfinally = null;
|
2072
|
+
body = new AST_TryBlock({
|
2073
|
+
start : S.token,
|
2074
|
+
body : block_(),
|
2075
|
+
end : prev(),
|
2076
|
+
});
|
2057
2077
|
if (is("keyword", "catch")) {
|
2058
2078
|
var start = S.token;
|
2059
2079
|
next();
|
@@ -2089,14 +2109,20 @@ function parse($TEXT, options) {
|
|
2089
2109
|
});
|
2090
2110
|
}
|
2091
2111
|
|
2112
|
+
/**
|
2113
|
+
* var
|
2114
|
+
* vardef1 = 2,
|
2115
|
+
* vardef2 = 3;
|
2116
|
+
*/
|
2092
2117
|
function vardefs(no_in, kind) {
|
2093
|
-
var
|
2118
|
+
var var_defs = [];
|
2094
2119
|
var def;
|
2095
2120
|
for (;;) {
|
2096
2121
|
var sym_type =
|
2097
2122
|
kind === "var" ? AST_SymbolVar :
|
2098
2123
|
kind === "const" ? AST_SymbolConst :
|
2099
2124
|
kind === "let" ? AST_SymbolLet : null;
|
2125
|
+
// var { a } = b
|
2100
2126
|
if (is("punc", "{") || is("punc", "[")) {
|
2101
2127
|
def = new AST_VarDef({
|
2102
2128
|
start: S.token,
|
@@ -2116,12 +2142,12 @@ function parse($TEXT, options) {
|
|
2116
2142
|
});
|
2117
2143
|
if (def.name.name == "import") croak("Unexpected token: import");
|
2118
2144
|
}
|
2119
|
-
|
2145
|
+
var_defs.push(def);
|
2120
2146
|
if (!is("punc", ","))
|
2121
2147
|
break;
|
2122
2148
|
next();
|
2123
2149
|
}
|
2124
|
-
return
|
2150
|
+
return var_defs;
|
2125
2151
|
}
|
2126
2152
|
|
2127
2153
|
var var_ = function(no_in) {
|
@@ -2200,6 +2226,7 @@ function parse($TEXT, options) {
|
|
2200
2226
|
value : tok.value,
|
2201
2227
|
quote : tok.quote
|
2202
2228
|
});
|
2229
|
+
annotate(ret);
|
2203
2230
|
break;
|
2204
2231
|
case "regexp":
|
2205
2232
|
const [_, source, flags] = tok.value.match(/^\/(.*)\/(\w*)$/);
|
@@ -2282,8 +2309,8 @@ function parse($TEXT, options) {
|
|
2282
2309
|
if (is("operator", "new")) {
|
2283
2310
|
return new_(allow_calls);
|
2284
2311
|
}
|
2285
|
-
if (is("
|
2286
|
-
return import_meta();
|
2312
|
+
if (is("name", "import") && is_token(peek(), "punc", ".")) {
|
2313
|
+
return import_meta(allow_calls);
|
2287
2314
|
}
|
2288
2315
|
var start = S.token;
|
2289
2316
|
var peeked;
|
@@ -2776,21 +2803,22 @@ function parse($TEXT, options) {
|
|
2776
2803
|
});
|
2777
2804
|
}
|
2778
2805
|
|
2779
|
-
function import_meta() {
|
2806
|
+
function import_meta(allow_calls) {
|
2780
2807
|
var start = S.token;
|
2781
|
-
expect_token("
|
2808
|
+
expect_token("name", "import");
|
2782
2809
|
expect_token("punc", ".");
|
2783
2810
|
expect_token("name", "meta");
|
2784
2811
|
return subscripts(new AST_ImportMeta({
|
2785
2812
|
start: start,
|
2786
2813
|
end: prev()
|
2787
|
-
}),
|
2814
|
+
}), allow_calls);
|
2788
2815
|
}
|
2789
2816
|
|
2790
2817
|
function map_name(is_import) {
|
2791
|
-
function make_symbol(type) {
|
2818
|
+
function make_symbol(type, quote) {
|
2792
2819
|
return new type({
|
2793
2820
|
name: as_property_name(),
|
2821
|
+
quote: quote || undefined,
|
2794
2822
|
start: prev(),
|
2795
2823
|
end: prev()
|
2796
2824
|
});
|
@@ -2803,16 +2831,16 @@ function parse($TEXT, options) {
|
|
2803
2831
|
var name;
|
2804
2832
|
|
2805
2833
|
if (is_import) {
|
2806
|
-
foreign_name = make_symbol(foreign_type);
|
2834
|
+
foreign_name = make_symbol(foreign_type, start.quote);
|
2807
2835
|
} else {
|
2808
|
-
name = make_symbol(type);
|
2836
|
+
name = make_symbol(type, start.quote);
|
2809
2837
|
}
|
2810
2838
|
if (is("name", "as")) {
|
2811
2839
|
next(); // The "as" word
|
2812
2840
|
if (is_import) {
|
2813
2841
|
name = make_symbol(type);
|
2814
2842
|
} else {
|
2815
|
-
foreign_name = make_symbol(foreign_type);
|
2843
|
+
foreign_name = make_symbol(foreign_type, S.token.quote);
|
2816
2844
|
}
|
2817
2845
|
} else if (is_import) {
|
2818
2846
|
name = new type(foreign_name);
|
@@ -2828,20 +2856,26 @@ function parse($TEXT, options) {
|
|
2828
2856
|
});
|
2829
2857
|
}
|
2830
2858
|
|
2831
|
-
function map_nameAsterisk(is_import,
|
2859
|
+
function map_nameAsterisk(is_import, import_or_export_foreign_name) {
|
2832
2860
|
var foreign_type = is_import ? AST_SymbolImportForeign : AST_SymbolExportForeign;
|
2833
2861
|
var type = is_import ? AST_SymbolImport : AST_SymbolExport;
|
2834
2862
|
var start = S.token;
|
2835
|
-
var foreign_name;
|
2863
|
+
var name, foreign_name;
|
2836
2864
|
var end = prev();
|
2837
2865
|
|
2866
|
+
if (is_import) {
|
2867
|
+
name = import_or_export_foreign_name;
|
2868
|
+
} else {
|
2869
|
+
foreign_name = import_or_export_foreign_name;
|
2870
|
+
}
|
2871
|
+
|
2838
2872
|
name = name || new type({
|
2839
2873
|
start: start,
|
2840
2874
|
name: "*",
|
2841
2875
|
end: end,
|
2842
2876
|
});
|
2843
2877
|
|
2844
|
-
foreign_name = new foreign_type({
|
2878
|
+
foreign_name = foreign_name || new foreign_type({
|
2845
2879
|
start: start,
|
2846
2880
|
name: "*",
|
2847
2881
|
end: end,
|
@@ -2870,9 +2904,9 @@ function parse($TEXT, options) {
|
|
2870
2904
|
} else if (is("operator", "*")) {
|
2871
2905
|
var name;
|
2872
2906
|
next();
|
2873
|
-
if (
|
2907
|
+
if (is("name", "as")) {
|
2874
2908
|
next(); // The "as" word
|
2875
|
-
name =
|
2909
|
+
name = is_import ? as_symbol(AST_SymbolImport) : as_symbol_or_string(AST_SymbolExportForeign);
|
2876
2910
|
}
|
2877
2911
|
names = [map_nameAsterisk(is_import, name)];
|
2878
2912
|
}
|
@@ -3037,6 +3071,27 @@ function parse($TEXT, options) {
|
|
3037
3071
|
return sym;
|
3038
3072
|
}
|
3039
3073
|
|
3074
|
+
function as_symbol_or_string(type) {
|
3075
|
+
if (!is("name")) {
|
3076
|
+
if (!is("string")) {
|
3077
|
+
croak("Name or string expected");
|
3078
|
+
}
|
3079
|
+
var tok = S.token;
|
3080
|
+
var ret = new type({
|
3081
|
+
start : tok,
|
3082
|
+
end : tok,
|
3083
|
+
name : tok.value,
|
3084
|
+
quote : tok.quote
|
3085
|
+
});
|
3086
|
+
next();
|
3087
|
+
return ret;
|
3088
|
+
}
|
3089
|
+
var sym = _make_symbol(type);
|
3090
|
+
_verify_symbol(sym);
|
3091
|
+
next();
|
3092
|
+
return sym;
|
3093
|
+
}
|
3094
|
+
|
3040
3095
|
// Annotate AST_Call, AST_Lambda or AST_New with the special comments
|
3041
3096
|
function annotate(node) {
|
3042
3097
|
var start = node.start;
|
@@ -3058,6 +3113,10 @@ function parse($TEXT, options) {
|
|
3058
3113
|
set_annotation(node, _NOINLINE);
|
3059
3114
|
break;
|
3060
3115
|
}
|
3116
|
+
if (/[@#]__KEY__/.test(comment.value)) {
|
3117
|
+
set_annotation(node, _KEY);
|
3118
|
+
break;
|
3119
|
+
}
|
3061
3120
|
}
|
3062
3121
|
}
|
3063
3122
|
}
|
package/lib/propmangle.js
CHANGED
@@ -47,6 +47,8 @@
|
|
47
47
|
import {
|
48
48
|
defaults,
|
49
49
|
push_uniq,
|
50
|
+
has_annotation,
|
51
|
+
clear_annotation,
|
50
52
|
} from "./utils/index.js";
|
51
53
|
import { base54 } from "./scope.js";
|
52
54
|
import {
|
@@ -67,6 +69,7 @@ import {
|
|
67
69
|
AST_Sub,
|
68
70
|
TreeTransformer,
|
69
71
|
TreeWalker,
|
72
|
+
_KEY,
|
70
73
|
} from "./ast.js";
|
71
74
|
import { domprops } from "../tools/domprops.js";
|
72
75
|
|
@@ -263,6 +266,8 @@ function mangle_properties(ast, options) {
|
|
263
266
|
addStrings(node.args[1], add);
|
264
267
|
} else if (node instanceof AST_Binary && node.operator === "in") {
|
265
268
|
addStrings(node.left, add);
|
269
|
+
} else if (node instanceof AST_String && has_annotation(node, _KEY)) {
|
270
|
+
add(node.value);
|
266
271
|
}
|
267
272
|
}));
|
268
273
|
|
@@ -296,6 +301,10 @@ function mangle_properties(ast, options) {
|
|
296
301
|
node.args[1] = mangleStrings(node.args[1]);
|
297
302
|
} else if (node instanceof AST_Binary && node.operator === "in") {
|
298
303
|
node.left = mangleStrings(node.left);
|
304
|
+
} else if (node instanceof AST_String && has_annotation(node, _KEY)) {
|
305
|
+
// Clear _KEY annotation to prevent double mangling
|
306
|
+
clear_annotation(node, _KEY);
|
307
|
+
node.value = mangle(node.value);
|
299
308
|
}
|
300
309
|
}));
|
301
310
|
|
@@ -361,6 +370,8 @@ function mangle_properties(ast, options) {
|
|
361
370
|
var last = node.expressions.length - 1;
|
362
371
|
node.expressions[last] = mangleStrings(node.expressions[last]);
|
363
372
|
} else if (node instanceof AST_String) {
|
373
|
+
// Clear _KEY annotation to prevent double mangling
|
374
|
+
clear_annotation(node, _KEY);
|
364
375
|
node.value = mangle(node.value);
|
365
376
|
} else if (node instanceof AST_Conditional) {
|
366
377
|
node.consequent = mangleStrings(node.consequent);
|
package/lib/scope.js
CHANGED
@@ -58,7 +58,6 @@ import {
|
|
58
58
|
AST_Arrow,
|
59
59
|
AST_Block,
|
60
60
|
AST_Call,
|
61
|
-
AST_Catch,
|
62
61
|
AST_Class,
|
63
62
|
AST_Conditional,
|
64
63
|
AST_DefClass,
|
@@ -69,6 +68,7 @@ import {
|
|
69
68
|
AST_Export,
|
70
69
|
AST_For,
|
71
70
|
AST_ForIn,
|
71
|
+
AST_ForOf,
|
72
72
|
AST_Function,
|
73
73
|
AST_Import,
|
74
74
|
AST_IterationStatement,
|
@@ -222,16 +222,12 @@ AST_Scope.DEFMETHOD("figure_out_scope", function(options, { parent_scope = null,
|
|
222
222
|
const save_scope = scope;
|
223
223
|
node.block_scope = scope = new AST_Scope(node);
|
224
224
|
scope._block_scope = true;
|
225
|
-
|
226
|
-
// and its catch and finally branches are children of the AST_Try itself
|
227
|
-
const parent_scope = node instanceof AST_Catch
|
228
|
-
? save_scope.parent_scope
|
229
|
-
: save_scope;
|
230
|
-
scope.init_scope_vars(parent_scope);
|
225
|
+
scope.init_scope_vars(save_scope);
|
231
226
|
scope.uses_with = save_scope.uses_with;
|
232
227
|
scope.uses_eval = save_scope.uses_eval;
|
228
|
+
|
233
229
|
if (options.safari10) {
|
234
|
-
if (node instanceof AST_For || node instanceof AST_ForIn) {
|
230
|
+
if (node instanceof AST_For || node instanceof AST_ForIn || node instanceof AST_ForOf) {
|
235
231
|
for_scopes.push(scope);
|
236
232
|
}
|
237
233
|
}
|
@@ -241,7 +237,7 @@ AST_Scope.DEFMETHOD("figure_out_scope", function(options, { parent_scope = null,
|
|
241
237
|
// AST_Switch has a scope within the body, but it itself "is a block scope"
|
242
238
|
// This means the switched expression has to belong to the outer scope
|
243
239
|
// while the body inside belongs to the switch itself.
|
244
|
-
// This is pretty nasty and warrants an AST change
|
240
|
+
// This is pretty nasty and warrants an AST change
|
245
241
|
const the_block_scope = scope;
|
246
242
|
scope = save_scope;
|
247
243
|
node.expression.walk(tw);
|
package/lib/size.js
CHANGED
@@ -216,9 +216,7 @@ AST_Default.prototype._size = function () {
|
|
216
216
|
return 8 + list_overhead(this.body);
|
217
217
|
};
|
218
218
|
|
219
|
-
AST_Try.prototype._size =
|
220
|
-
return 3 + list_overhead(this.body);
|
221
|
-
};
|
219
|
+
AST_Try.prototype._size = () => 3;
|
222
220
|
|
223
221
|
AST_Catch.prototype._size = function () {
|
224
222
|
let size = 7 + list_overhead(this.body);
|
package/lib/transform.js
CHANGED
@@ -89,7 +89,7 @@ import {
|
|
89
89
|
AST_Yield,
|
90
90
|
} from "./ast.js";
|
91
91
|
import {
|
92
|
-
MAP,
|
92
|
+
MAP as do_list,
|
93
93
|
noop,
|
94
94
|
} from "./utils/index.js";
|
95
95
|
|
@@ -111,12 +111,6 @@ function def_transform(node, descend) {
|
|
111
111
|
});
|
112
112
|
}
|
113
113
|
|
114
|
-
function do_list(list, tw) {
|
115
|
-
return MAP(list, function(node) {
|
116
|
-
return node.transform(tw, true);
|
117
|
-
});
|
118
|
-
}
|
119
|
-
|
120
114
|
def_transform(AST_Node, noop);
|
121
115
|
|
122
116
|
def_transform(AST_LabeledStatement, function(self, tw) {
|
@@ -185,7 +179,7 @@ def_transform(AST_Case, function(self, tw) {
|
|
185
179
|
});
|
186
180
|
|
187
181
|
def_transform(AST_Try, function(self, tw) {
|
188
|
-
self.body =
|
182
|
+
self.body = self.body.transform(tw);
|
189
183
|
if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
|
190
184
|
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
191
185
|
});
|
@@ -210,7 +204,7 @@ def_transform(AST_Destructuring, function(self, tw) {
|
|
210
204
|
|
211
205
|
def_transform(AST_Lambda, function(self, tw) {
|
212
206
|
if (self.name) self.name = self.name.transform(tw);
|
213
|
-
self.argnames = do_list(self.argnames, tw);
|
207
|
+
self.argnames = do_list(self.argnames, tw, /* allow_splicing */ false);
|
214
208
|
if (self.body instanceof AST_Node) {
|
215
209
|
self.body = self.body.transform(tw);
|
216
210
|
} else {
|
@@ -220,7 +214,7 @@ def_transform(AST_Lambda, function(self, tw) {
|
|
220
214
|
|
221
215
|
def_transform(AST_Call, function(self, tw) {
|
222
216
|
self.expression = self.expression.transform(tw);
|
223
|
-
self.args = do_list(self.args, tw);
|
217
|
+
self.args = do_list(self.args, tw, /* allow_splicing */ false);
|
224
218
|
});
|
225
219
|
|
226
220
|
def_transform(AST_Sequence, function(self, tw) {
|
package/lib/utils/index.js
CHANGED
@@ -43,6 +43,8 @@
|
|
43
43
|
|
44
44
|
"use strict";
|
45
45
|
|
46
|
+
import { AST_Node } from "../ast.js";
|
47
|
+
|
46
48
|
function characters(str) {
|
47
49
|
return str.split("");
|
48
50
|
}
|
@@ -96,48 +98,26 @@ function return_this() { return this; }
|
|
96
98
|
function return_null() { return null; }
|
97
99
|
|
98
100
|
var MAP = (function() {
|
99
|
-
function MAP(a,
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
top.push(val);
|
111
|
-
}
|
112
|
-
} else if (val !== skip) {
|
113
|
-
if (val instanceof Splice) {
|
114
|
-
ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v);
|
115
|
-
} else {
|
116
|
-
ret.push(val);
|
117
|
-
}
|
118
|
-
}
|
119
|
-
return is_last;
|
120
|
-
}
|
121
|
-
if (Array.isArray(a)) {
|
122
|
-
if (backwards) {
|
123
|
-
for (i = a.length; --i >= 0;) if (doit()) break;
|
124
|
-
ret.reverse();
|
125
|
-
top.reverse();
|
126
|
-
} else {
|
127
|
-
for (i = 0; i < a.length; ++i) if (doit()) break;
|
101
|
+
function MAP(a, tw, allow_splicing = true) {
|
102
|
+
const new_a = [];
|
103
|
+
|
104
|
+
for (let i = 0; i < a.length; ++i) {
|
105
|
+
let item = a[i];
|
106
|
+
let ret = item.transform(tw, allow_splicing);
|
107
|
+
|
108
|
+
if (ret instanceof AST_Node) {
|
109
|
+
new_a.push(ret);
|
110
|
+
} else if (ret instanceof Splice) {
|
111
|
+
new_a.push(...ret.v);
|
128
112
|
}
|
129
|
-
} else {
|
130
|
-
for (i in a) if (HOP(a, i)) if (doit()) break;
|
131
113
|
}
|
132
|
-
|
114
|
+
|
115
|
+
return new_a;
|
133
116
|
}
|
134
|
-
|
117
|
+
|
135
118
|
MAP.splice = function(val) { return new Splice(val); };
|
136
|
-
MAP.
|
137
|
-
var skip = MAP.skip = {};
|
138
|
-
function AtTop(val) { this.v = val; }
|
119
|
+
MAP.skip = {};
|
139
120
|
function Splice(val) { this.v = val; }
|
140
|
-
function Last(val) { this.v = val; }
|
141
121
|
return MAP;
|
142
122
|
})();
|
143
123
|
|
@@ -257,7 +237,7 @@ const re_safe_regexp = /^[\\/|\0\s\w^$.[\]()]*$/;
|
|
257
237
|
/** Check if the regexp is safe for Terser to create without risking a RegExp DOS */
|
258
238
|
export const regexp_is_safe = (source) => re_safe_regexp.test(source);
|
259
239
|
|
260
|
-
const all_flags = "
|
240
|
+
const all_flags = "dgimsuyv";
|
261
241
|
function sort_regexp_flags(flags) {
|
262
242
|
const existing_flags = new Set(flags.split(""));
|
263
243
|
let out = "";
|
@@ -282,6 +262,10 @@ function set_annotation(node, annotation) {
|
|
282
262
|
node._annotations |= annotation;
|
283
263
|
}
|
284
264
|
|
265
|
+
function clear_annotation(node, annotation) {
|
266
|
+
node._annotations &= ~annotation;
|
267
|
+
}
|
268
|
+
|
285
269
|
export {
|
286
270
|
characters,
|
287
271
|
defaults,
|
@@ -306,5 +290,6 @@ export {
|
|
306
290
|
sort_regexp_flags,
|
307
291
|
string_template,
|
308
292
|
has_annotation,
|
309
|
-
set_annotation
|
293
|
+
set_annotation,
|
294
|
+
clear_annotation,
|
310
295
|
};
|
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.17.7",
|
8
8
|
"engines": {
|
9
9
|
"node": ">=10"
|
10
10
|
},
|
@@ -44,22 +44,21 @@
|
|
44
44
|
"main.js"
|
45
45
|
],
|
46
46
|
"dependencies": {
|
47
|
-
"@jridgewell/source-map": "^0.3.
|
48
|
-
"acorn": "^8.
|
47
|
+
"@jridgewell/source-map": "^0.3.3",
|
48
|
+
"acorn": "^8.8.2",
|
49
49
|
"commander": "^2.20.0",
|
50
50
|
"source-map-support": "~0.5.20"
|
51
51
|
},
|
52
52
|
"devDependencies": {
|
53
|
-
"@ls-lint/ls-lint": "^1.
|
54
|
-
"astring": "^1.
|
53
|
+
"@ls-lint/ls-lint": "^1.11.2",
|
54
|
+
"astring": "^1.8.5",
|
55
55
|
"eslint": "^7.32.0",
|
56
56
|
"eslump": "^3.0.0",
|
57
57
|
"esm": "^3.2.25",
|
58
58
|
"mocha": "^9.2.0",
|
59
59
|
"pre-commit": "^1.2.2",
|
60
|
-
"
|
61
|
-
"
|
62
|
-
"semver": "^7.3.4",
|
60
|
+
"rollup": "^2.56.3",
|
61
|
+
"semver": "^7.5.1",
|
63
62
|
"source-map": "~0.8.0-beta.0"
|
64
63
|
},
|
65
64
|
"scripts": {
|
@@ -69,7 +68,7 @@
|
|
69
68
|
"lint": "eslint lib",
|
70
69
|
"lint-fix": "eslint --fix lib",
|
71
70
|
"ls-lint": "ls-lint",
|
72
|
-
"build": "
|
71
|
+
"build": "rollup --config --silent",
|
73
72
|
"prepare": "npm run build",
|
74
73
|
"postversion": "echo 'Remember to update the changelog!'"
|
75
74
|
},
|
package/tools/domprops.js
CHANGED
@@ -3575,6 +3575,7 @@ export var domprops = [
|
|
3575
3575
|
"coneInnerAngle",
|
3576
3576
|
"coneOuterAngle",
|
3577
3577
|
"coneOuterGain",
|
3578
|
+
"configurable",
|
3578
3579
|
"configuration",
|
3579
3580
|
"configurationName",
|
3580
3581
|
"configurationValue",
|
@@ -4084,6 +4085,7 @@ export var domprops = [
|
|
4084
4085
|
"entities",
|
4085
4086
|
"entries",
|
4086
4087
|
"entryType",
|
4088
|
+
"enumerable",
|
4087
4089
|
"enumerate",
|
4088
4090
|
"enumerateDevices",
|
4089
4091
|
"enumerateEditable",
|
@@ -4766,6 +4768,7 @@ export var domprops = [
|
|
4766
4768
|
"indexOf",
|
4767
4769
|
"indexedDB",
|
4768
4770
|
"indicate",
|
4771
|
+
"inert",
|
4769
4772
|
"inertiaDestinationX",
|
4770
4773
|
"inertiaDestinationY",
|
4771
4774
|
"info",
|
package/tools/terser.d.ts
CHANGED
package/bin/terser.mjs
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
#!/usr/bin/env node
|
2
|
-
|
3
|
-
"use strict";
|
4
|
-
|
5
|
-
import "../tools/exit.cjs";
|
6
|
-
|
7
|
-
import fs from "fs"
|
8
|
-
import path from "path"
|
9
|
-
import program from "commander"
|
10
|
-
|
11
|
-
import { run_cli } from "../lib/cli.js"
|
12
|
-
|
13
|
-
const packageJson = {
|
14
|
-
name: "terser",
|
15
|
-
version: "experimental module CLI"
|
16
|
-
}
|
17
|
-
|
18
|
-
run_cli({ program, packageJson, fs, path }).catch((error) => {
|
19
|
-
console.error(error);
|
20
|
-
process.exitCode = 1;
|
21
|
-
});
|