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/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 = block_(), bcatch = null, bfinally = null;
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 a = [];
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
- a.push(def);
2145
+ var_defs.push(def);
2120
2146
  if (!is("punc", ","))
2121
2147
  break;
2122
2148
  next();
2123
2149
  }
2124
- return a;
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("operator", "import")) {
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("operator", "import");
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
- }), false);
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, name) {
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 (is_import && is("name", "as")) {
2907
+ if (is("name", "as")) {
2874
2908
  next(); // The "as" word
2875
- name = as_symbol(is_import ? AST_SymbolImport : AST_SymbolExportForeign);
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
- // AST_Try in the AST sadly *is* (not has) a body itself,
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 similar to AST_Try (read above)
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 = function () {
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 = do_list(self.body, tw);
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) {
@@ -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, f, backwards) {
100
- var ret = [], top = [], i;
101
- function doit() {
102
- var val = f(a[i], i);
103
- var is_last = val instanceof Last;
104
- if (is_last) val = val.v;
105
- if (val instanceof AtTop) {
106
- val = val.v;
107
- if (val instanceof Splice) {
108
- top.push.apply(top, backwards ? val.v.slice().reverse() : val.v);
109
- } else {
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
- return top.concat(ret);
114
+
115
+ return new_a;
133
116
  }
134
- MAP.at_top = function(val) { return new AtTop(val); };
117
+
135
118
  MAP.splice = function(val) { return new Splice(val); };
136
- MAP.last = function(val) { return new Last(val); };
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 = "dgimsuy";
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.16.1",
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.2",
48
- "acorn": "^8.5.0",
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.10.0",
54
- "astring": "^1.7.5",
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
- "rimraf": "^3.0.2",
61
- "rollup": "2.56.3",
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": "rimraf dist/bundle* && rollup --config --silent",
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
@@ -204,6 +204,7 @@ export interface SourceMapOptions {
204
204
  includeSources?: boolean;
205
205
  filename?: string;
206
206
  root?: string;
207
+ asObject?: boolean;
207
208
  url?: string | 'inline';
208
209
  }
209
210
 
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
- });