terser 5.47.1 → 5.49.0

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/ast.js CHANGED
@@ -1535,9 +1535,10 @@ var AST_NameMapping = DEFNODE("NameMapping", "foreign_name name", function AST_N
1535
1535
 
1536
1536
  var AST_Import = DEFNODE(
1537
1537
  "Import",
1538
- "imported_name imported_names module_name attributes",
1538
+ "phase imported_name imported_names module_name attributes",
1539
1539
  function AST_Import(props) {
1540
1540
  if (props) {
1541
+ this.phase = props.phase;
1541
1542
  this.imported_name = props.imported_name;
1542
1543
  this.imported_names = props.imported_names;
1543
1544
  this.module_name = props.module_name;
@@ -1551,6 +1552,7 @@ var AST_Import = DEFNODE(
1551
1552
  {
1552
1553
  $documentation: "An `import` statement",
1553
1554
  $propdoc: {
1555
+ phase: "[string?] Phase keyword: 'source', 'defer', or null.",
1554
1556
  imported_name: "[AST_SymbolImport] The name of the variable holding the module's default export.",
1555
1557
  imported_names: "[AST_NameMapping*] The names of non-default imported variables",
1556
1558
  module_name: "[AST_String] String literal describing where this module came from",
@@ -1591,6 +1593,40 @@ var AST_ImportMeta = DEFNODE("ImportMeta", null, function AST_ImportMeta(props)
1591
1593
  $documentation: "A reference to import.meta",
1592
1594
  });
1593
1595
 
1596
+ var AST_DynamicImport = DEFNODE(
1597
+ "DynamicImport",
1598
+ "phase args",
1599
+ function AST_DynamicImport(props) {
1600
+ if (props) {
1601
+ this.phase = props.phase;
1602
+ this.args = props.args;
1603
+ this.start = props.start;
1604
+ this.end = props.end;
1605
+ }
1606
+
1607
+ this.flags = 0;
1608
+ },
1609
+ {
1610
+ $documentation: "A phased dynamic import expression: `import.source(specifier [, options])` or `import.defer(specifier [, options])`. Plain `import(x)` continues to be parsed as an AST_Call with a synthetic `import` SymbolRef callee.",
1611
+ $propdoc: {
1612
+ phase: "[string] Phase keyword ('source' or 'defer').",
1613
+ args: "[AST_Node*] specifier followed by optional options argument"
1614
+ },
1615
+ _walk: function(visitor) {
1616
+ return visitor._visit(this, function() {
1617
+ var args = this.args;
1618
+ for (var i = 0, len = args.length; i < len; i++) {
1619
+ args[i]._walk(visitor);
1620
+ }
1621
+ });
1622
+ },
1623
+ _children_backwards(push) {
1624
+ let i = this.args.length;
1625
+ while (i--) push(this.args[i]);
1626
+ },
1627
+ }
1628
+ );
1629
+
1594
1630
  var AST_Export = DEFNODE(
1595
1631
  "Export",
1596
1632
  "exported_definition exported_value is_default exported_names module_name attributes",
@@ -3375,6 +3411,7 @@ export {
3375
3411
  AST_Function,
3376
3412
  AST_Hole,
3377
3413
  AST_If,
3414
+ AST_DynamicImport,
3378
3415
  AST_Import,
3379
3416
  AST_ImportMeta,
3380
3417
  AST_Infinity,
@@ -58,6 +58,7 @@ import {
58
58
  AST_Constant,
59
59
  AST_DefClass,
60
60
  AST_Dot,
61
+ AST_DynamicImport,
61
62
  AST_Expansion,
62
63
  AST_Function,
63
64
  AST_Node,
@@ -152,6 +153,12 @@ def_drop_side_effect_free(AST_Call, function (compressor, first_in_statement) {
152
153
  return args && make_sequence(this, args);
153
154
  });
154
155
 
156
+ def_drop_side_effect_free(AST_DynamicImport, function (compressor, first_in_statement) {
157
+ if (this.phase !== "source") return this;
158
+ var args = trim(this.args, compressor, first_in_statement);
159
+ return args && make_sequence(this, args);
160
+ });
161
+
155
162
  def_drop_side_effect_free(AST_Accessor, return_null);
156
163
 
157
164
  def_drop_side_effect_free(AST_Function, return_null);
@@ -290,12 +290,15 @@ def_eval(AST_Binary, function (compressor, depth) {
290
290
  return this;
291
291
  }
292
292
 
293
- // Do not mix BigInt and Number; Don't use `>>>` on BigInt or `/ 0n`
293
+ // Do not mix BigInt and Number
294
+ // Don't use `>>>` on BigInt or `/ 0n` (error)
295
+ // Don't use `**` on BigInt (slow)
294
296
  if (
295
297
  (typeof left === "bigint") !== (typeof right === "bigint")
296
298
  || typeof left === "bigint"
297
- && (this.operator === ">>>"
298
- || this.operator === "/" && Number(right) === 0)
299
+ && (this.operator === "/" && Number(right) === 0
300
+ || this.operator === ">>>"
301
+ || this.operator === "**")
299
302
  ) {
300
303
  return this;
301
304
  }
@@ -159,11 +159,11 @@ import {
159
159
  import { first_in_statement } from "../utils/first_in_statement.js";
160
160
  import { equivalent_to } from "../equivalent-to.js";
161
161
  import {
162
- is_basic_identifier_string,
163
162
  JS_Parse_Error,
164
163
  parse,
165
164
  PRECEDENCE,
166
165
  } from "../parse.js";
166
+ import { is_basic_identifier_string } from "../unicode.js";
167
167
  import { OutputStream } from "../output.js";
168
168
  import { base54, format_mangler_options } from "../scope.js";
169
169
  import "../size.js";
@@ -69,6 +69,7 @@ import {
69
69
  AST_Function,
70
70
  AST_If,
71
71
  AST_Import,
72
+ AST_DynamicImport,
72
73
  AST_ImportMeta,
73
74
  AST_Jump,
74
75
  AST_LabeledStatement,
@@ -403,6 +404,10 @@ export function is_nullish(node, compressor) {
403
404
  || this.alternative && this.alternative.has_side_effects(compressor);
404
405
  });
405
406
  def_has_side_effects(AST_ImportMeta, return_false);
407
+ def_has_side_effects(AST_DynamicImport, function() {
408
+ // `import.source(x)` only compiles the module, which is side-effect free
409
+ return this.phase !== "source";
410
+ });
406
411
  def_has_side_effects(AST_LabeledStatement, function(compressor) {
407
412
  return this.body.has_side_effects(compressor);
408
413
  });
@@ -29,6 +29,7 @@ import {
29
29
  AST_ForOf,
30
30
  AST_If,
31
31
  AST_Import,
32
+ AST_DynamicImport,
32
33
  AST_ImportMeta,
33
34
  AST_Jump,
34
35
  AST_LabeledStatement,
@@ -193,11 +194,18 @@ AST_VarDefLike.prototype.shallow_cmp = function(other) {
193
194
  AST_NameMapping.prototype.shallow_cmp = pass_through;
194
195
 
195
196
  AST_Import.prototype.shallow_cmp = function(other) {
196
- return (this.imported_name == null ? other.imported_name == null : this.imported_name === other.imported_name) && (this.imported_names == null ? other.imported_names == null : this.imported_names === other.imported_names) && (this.attributes == null ? other.attributes == null : this.attributes === other.attributes);
197
+ return (this.imported_name || null) === (other.imported_name || null)
198
+ && (this.imported_names || null) === (other.imported_names || null)
199
+ && (this.attributes || null) === (other.attributes || null)
200
+ && (this.phase || null) === (other.phase || null);
197
201
  };
198
202
 
199
203
  AST_ImportMeta.prototype.shallow_cmp = pass_through;
200
204
 
205
+ AST_DynamicImport.prototype.shallow_cmp = function(other) {
206
+ return (this.phase || null) === (other.phase || null) && this.args.length === other.args.length;
207
+ };
208
+
201
209
  AST_Export.prototype.shallow_cmp = function(other) {
202
210
  return (this.exported_definition == null ? other.exported_definition == null : this.exported_definition === other.exported_definition) && (this.exported_value == null ? other.exported_value == null : this.exported_value === other.exported_value) && (this.exported_names == null ? other.exported_names == null : this.exported_names === other.exported_names) && (this.attributes == null ? other.attributes == null : this.attributes === other.attributes) && this.module_name === other.module_name && this.is_default === other.is_default;
203
211
  };
@@ -91,6 +91,7 @@ import {
91
91
  AST_Function,
92
92
  AST_Hole,
93
93
  AST_If,
94
+ AST_DynamicImport,
94
95
  AST_Import,
95
96
  AST_ImportMeta,
96
97
  AST_Label,
@@ -165,7 +166,7 @@ import {
165
166
  AST_With,
166
167
  AST_Yield,
167
168
  } from "./ast.js";
168
- import { is_basic_identifier_string } from "./parse.js";
169
+ import { is_basic_identifier_string } from "./unicode.js";
169
170
 
170
171
  (function() {
171
172
 
@@ -585,7 +586,8 @@ import { is_basic_identifier_string } from "./parse.js";
585
586
  imported_name: imported_name,
586
587
  imported_names : imported_names,
587
588
  module_name : from_moz(M.source),
588
- attributes: import_attributes_from_moz(M.attributes || M.assertions)
589
+ attributes: import_attributes_from_moz(M.attributes || M.assertions),
590
+ phase: M.phase || null
589
591
  });
590
592
  },
591
593
 
@@ -616,6 +618,14 @@ import { is_basic_identifier_string } from "./parse.js";
616
618
  if (M.options) {
617
619
  args.push(from_moz(M.options));
618
620
  }
621
+ if (M.phase) {
622
+ return new AST_DynamicImport({
623
+ start: my_start_token(M),
624
+ end: my_end_token(M),
625
+ phase: M.phase,
626
+ args: args
627
+ });
628
+ }
619
629
  return new AST_Call({
620
630
  start: my_start_token(M),
621
631
  end: my_end_token(M),
@@ -1215,6 +1225,16 @@ import { is_basic_identifier_string } from "./parse.js";
1215
1225
  };
1216
1226
  });
1217
1227
 
1228
+ def_to_moz(AST_DynamicImport, function To_Moz_ImportExpression(M) {
1229
+ const [source, options] = M.args.map(to_moz);
1230
+ return {
1231
+ type: "ImportExpression",
1232
+ source,
1233
+ options: options || null,
1234
+ phase: M.phase
1235
+ };
1236
+ });
1237
+
1218
1238
  def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
1219
1239
  return to_moz_scope("Program", M);
1220
1240
  });
@@ -1479,12 +1499,14 @@ import { is_basic_identifier_string } from "./parse.js";
1479
1499
  });
1480
1500
  }
1481
1501
  }
1482
- return {
1502
+ var moz = {
1483
1503
  type: "ImportDeclaration",
1484
1504
  specifiers: specifiers,
1485
1505
  source: to_moz(M.module_name),
1486
1506
  attributes: import_attributes_to_moz(M.attributes)
1487
1507
  };
1508
+ if (M.phase) moz.phase = M.phase;
1509
+ return moz;
1488
1510
  });
1489
1511
 
1490
1512
  def_to_moz(AST_ImportMeta, function To_Moz_MetaProperty() {
package/lib/output.js CHANGED
@@ -103,6 +103,7 @@ import {
103
103
  AST_Function,
104
104
  AST_Hole,
105
105
  AST_If,
106
+ AST_DynamicImport,
106
107
  AST_Import,
107
108
  AST_ImportMeta,
108
109
  AST_Jump,
@@ -159,13 +160,18 @@ import {
159
160
  walk_abort
160
161
  } from "./ast.js";
161
162
  import {
162
- get_full_char_code,
163
163
  get_full_char,
164
- is_identifier_char,
164
+ get_full_char_code,
165
165
  is_basic_identifier_string,
166
+ is_identifier_char,
167
+ is_identifier_char_broad,
168
+ is_identifier_start,
169
+ is_identifier_start_broad,
166
170
  is_identifier_string,
167
- PRECEDENCE,
171
+ } from "./unicode.js";
172
+ import {
168
173
  ALL_RESERVED_WORDS,
174
+ PRECEDENCE,
169
175
  } from "./parse.js";
170
176
 
171
177
  const CODE_LINE_BREAK = 10;
@@ -363,6 +369,56 @@ function OutputStream(options) {
363
369
  });
364
370
  };
365
371
 
372
+ /** Matches an identifier with non-ascii characters */
373
+ var re_high_identifier = (() => {
374
+ try {
375
+ return new RegExp("^(?![\\u0000-\\u00ff]+$)([\\p{ID_Start}][\\p{ID_Continue}]*)$", "u");
376
+ } catch (_) {
377
+ return undefined; /* \p in regex above is unsupported */
378
+ }
379
+ })();
380
+
381
+ var ident_to_utf8 = (options.ascii_only || !re_high_identifier) ? to_utf8 : function (str) {
382
+ if (re_high_identifier.test(str)) {
383
+ str = str.replace(/[\ud800-\udbff][\udc00-\udfff]|([\ud800-\udbff]|[\udc00-\udfff])/g, function(match, lone) {
384
+ if (lone) {
385
+ return "\\u" + lone.charCodeAt(0).toString(16).padStart(4, "0");
386
+ }
387
+ return match;
388
+ });
389
+
390
+ // Escape identifier characters from higher unicode versions
391
+ var char = get_full_char(str, 0);
392
+ var escaped = char;
393
+ if (
394
+ is_identifier_start_broad(char)
395
+ && !is_identifier_start(char)
396
+ ) {
397
+ const code_point = char.codePointAt(0);
398
+ escaped = code_point <= 0xffff
399
+ ? `\\u${code_point.toString(16).padStart(4, "0")}`
400
+ : `\\u{${code_point.toString(16)}}`;
401
+ }
402
+ for (var i = char.length; i < str.length; i += char.length) {
403
+ char = get_full_char(str, i);
404
+ if (
405
+ is_identifier_char_broad(char)
406
+ && !is_identifier_char(char)
407
+ ) {
408
+ const code_point = char.codePointAt(0);
409
+ escaped += code_point <= 0xffff
410
+ ? `\\u${code_point.toString(16).padStart(4, "0")}`
411
+ : `\\u{${code_point.toString(16)}}`;
412
+ } else {
413
+ escaped += char;
414
+ }
415
+ }
416
+ return escaped;
417
+ } else {
418
+ return str;
419
+ }
420
+ };
421
+
366
422
  function make_string(str, quote) {
367
423
  var dq = 0, sq = 0;
368
424
  str = str.replace(/[\\\b\f\n\r\v\t\x22\x27\u2028\u2029\0\ufeff]/g,
@@ -420,7 +476,7 @@ function OutputStream(options) {
420
476
 
421
477
  function make_name(name) {
422
478
  name = name.toString();
423
- name = to_utf8(name, true);
479
+ name = ident_to_utf8(name, true);
424
480
  return name;
425
481
  }
426
482
 
@@ -537,8 +593,8 @@ function OutputStream(options) {
537
593
  }
538
594
 
539
595
  if (might_need_space) {
540
- if ((is_identifier_char(prev)
541
- && (is_identifier_char(ch) || ch == "\\"))
596
+ if ((is_identifier_char_broad(prev)
597
+ && (is_identifier_char_broad(ch) || ch == "\\"))
542
598
  || (ch == "/" && ch == prev)
543
599
  || ((ch == "+" || ch == "-") && ch == last)
544
600
  ) {
@@ -1766,6 +1822,10 @@ function OutputStream(options) {
1766
1822
  DEFPRINT(AST_Import, function(self, output) {
1767
1823
  output.print("import");
1768
1824
  output.space();
1825
+ if (self.phase) {
1826
+ output.print(self.phase);
1827
+ output.space();
1828
+ }
1769
1829
  if (self.imported_name) {
1770
1830
  self.imported_name.print(output);
1771
1831
  }
@@ -1806,6 +1866,15 @@ function OutputStream(options) {
1806
1866
  DEFPRINT(AST_ImportMeta, function(self, output) {
1807
1867
  output.print("import.meta");
1808
1868
  });
1869
+ DEFPRINT(AST_DynamicImport, function(self, output) {
1870
+ output.print("import." + self.phase);
1871
+ output.with_parens(function() {
1872
+ self.args.forEach(function(arg, i) {
1873
+ if (i) output.comma();
1874
+ arg.print(output);
1875
+ });
1876
+ });
1877
+ });
1809
1878
 
1810
1879
  DEFPRINT(AST_NameMapping, function(self, output) {
1811
1880
  var is_import = output.parent() instanceof AST_Import;
package/lib/parse.js CHANGED
@@ -99,6 +99,7 @@ import {
99
99
  AST_Function,
100
100
  AST_Hole,
101
101
  AST_If,
102
+ AST_DynamicImport,
102
103
  AST_Import,
103
104
  AST_ImportMeta,
104
105
  AST_Infinity,
@@ -170,6 +171,13 @@ import {
170
171
  _KEY,
171
172
  _MANGLEPROP,
172
173
  } from "./ast.js";
174
+ import {
175
+ from_char_code,
176
+ get_full_char,
177
+ get_full_char_length,
178
+ is_identifier_char_broad,
179
+ is_identifier_start_broad,
180
+ } from "./unicode.js";
173
181
 
174
182
  var LATEST_RAW = ""; // Only used for numbers and template strings
175
183
  var TEMPLATE_RAWS = new Map(); // Raw template strings
@@ -262,103 +270,10 @@ var PUNC_CHARS = makePredicate(characters("[]{}(),;:"));
262
270
 
263
271
  /* -----[ Tokenizer ]----- */
264
272
 
265
- // surrogate safe regexps adapted from https://github.com/mathiasbynens/unicode-8.0.0/tree/89b412d8a71ecca9ed593d9e9fa073ab64acfebe/Binary_Property
266
- var UNICODE = {
267
- ID_Start: /[$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\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\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\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\u2071\u207F\u2090-\u209C\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-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\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\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\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\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\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\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\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]|\uD83A[\uDC00-\uDCC4]|\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]/,
268
- 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])+/,
269
- };
270
-
271
- function get_full_char(str, pos) {
272
- if (is_surrogate_pair_head(str.charCodeAt(pos))) {
273
- if (is_surrogate_pair_tail(str.charCodeAt(pos + 1))) {
274
- return str.charAt(pos) + str.charAt(pos + 1);
275
- }
276
- } else if (is_surrogate_pair_tail(str.charCodeAt(pos))) {
277
- if (is_surrogate_pair_head(str.charCodeAt(pos - 1))) {
278
- return str.charAt(pos - 1) + str.charAt(pos);
279
- }
280
- }
281
- return str.charAt(pos);
282
- }
283
-
284
- function get_full_char_code(str, pos) {
285
- // https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates
286
- if (is_surrogate_pair_head(str.charCodeAt(pos))) {
287
- return 0x10000 + (str.charCodeAt(pos) - 0xd800 << 10) + str.charCodeAt(pos + 1) - 0xdc00;
288
- }
289
- return str.charCodeAt(pos);
290
- }
291
-
292
- function get_full_char_length(str) {
293
- var surrogates = 0;
294
-
295
- for (var i = 0; i < str.length; i++) {
296
- if (is_surrogate_pair_head(str.charCodeAt(i)) && is_surrogate_pair_tail(str.charCodeAt(i + 1))) {
297
- surrogates++;
298
- i++;
299
- }
300
- }
301
-
302
- return str.length - surrogates;
303
- }
304
-
305
- function from_char_code(code) {
306
- // Based on https://github.com/mathiasbynens/String.fromCodePoint/blob/master/fromcodepoint.js
307
- if (code > 0xFFFF) {
308
- code -= 0x10000;
309
- return (String.fromCharCode((code >> 10) + 0xD800) +
310
- String.fromCharCode((code % 0x400) + 0xDC00));
311
- }
312
- return String.fromCharCode(code);
313
- }
314
-
315
- function is_surrogate_pair_head(code) {
316
- return code >= 0xd800 && code <= 0xdbff;
317
- }
318
-
319
- function is_surrogate_pair_tail(code) {
320
- return code >= 0xdc00 && code <= 0xdfff;
321
- }
322
-
323
273
  function is_digit(code) {
324
274
  return code >= 48 && code <= 57;
325
275
  }
326
276
 
327
- function is_identifier_start(ch) {
328
- return UNICODE.ID_Start.test(ch);
329
- }
330
-
331
- function is_identifier_char(ch) {
332
- return UNICODE.ID_Continue.test(ch);
333
- }
334
-
335
- const BASIC_IDENT = /^[a-z_$][a-z0-9_$]*$/i;
336
-
337
- function is_basic_identifier_string(str) {
338
- return BASIC_IDENT.test(str);
339
- }
340
-
341
- function is_identifier_string(str, allow_surrogates) {
342
- if (BASIC_IDENT.test(str)) {
343
- return true;
344
- }
345
- if (!allow_surrogates && /[\ud800-\udfff]/.test(str)) {
346
- return false;
347
- }
348
- var match = UNICODE.ID_Start.exec(str);
349
- if (!match || match.index !== 0) {
350
- return false;
351
- }
352
-
353
- str = str.slice(match[0].length);
354
- if (!str) {
355
- return true;
356
- }
357
-
358
- match = UNICODE.ID_Continue.exec(str);
359
- return !!match && match[0].length === str.length;
360
- }
361
-
362
277
  function parse_js_number(num, allow_e = true) {
363
278
  if (!allow_e && num.includes("e")) {
364
279
  return NaN;
@@ -557,11 +472,11 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
557
472
  function ch_starts_binding_identifier(ch, pos) {
558
473
  if (ch == "\\") {
559
474
  return true;
560
- } else if (is_identifier_start(ch)) {
475
+ } else if (is_identifier_start_broad(ch)) {
561
476
  RE_KEYWORD_RELATIONAL_OPERATORS.lastIndex = pos;
562
477
  if (RE_KEYWORD_RELATIONAL_OPERATORS.test(S.text)) {
563
478
  var after = get_full_char(S.text, RE_KEYWORD_RELATIONAL_OPERATORS.lastIndex);
564
- if (!is_identifier_char(after) && after != "\\") {
479
+ if (!is_identifier_char_broad(after) && after != "\\") {
565
480
  // "in" or "instanceof" are keywords, not binding identifiers
566
481
  return false;
567
482
  }
@@ -814,7 +729,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
814
729
  );
815
730
 
816
731
  // 0x7F is very rare in actual code, so we compare it to "~" (0x7E)
817
- if (end > start + 1 && ch && ch !== "\\" && !is_identifier_char(ch) && ch <= "~") {
732
+ if (end > start + 1 && ch && ch !== "\\" && !is_identifier_char_broad(ch) && ch <= "~") {
818
733
  S.pos += end - start;
819
734
  S.col += end - start;
820
735
  return S.text.slice(start, S.pos);
@@ -837,10 +752,10 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
837
752
  // Read first character (ID_Start)
838
753
  if ((ch = peek()) === "\\") {
839
754
  ch = read_escaped_identifier_char();
840
- if (!is_identifier_start(ch)) {
755
+ if (!is_identifier_start_broad(ch)) {
841
756
  parse_error("First identifier char is an invalid identifier char");
842
757
  }
843
- } else if (is_identifier_start(ch)) {
758
+ } else if (is_identifier_start_broad(ch)) {
844
759
  next();
845
760
  } else {
846
761
  return "";
@@ -852,11 +767,11 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
852
767
  while ((ch = peek()) != null) {
853
768
  if ((ch = peek()) === "\\") {
854
769
  ch = read_escaped_identifier_char();
855
- if (!is_identifier_char(ch)) {
770
+ if (!is_identifier_char_broad(ch)) {
856
771
  parse_error("Invalid escaped identifier char");
857
772
  }
858
773
  } else {
859
- if (!is_identifier_char(ch)) {
774
+ if (!is_identifier_char_broad(ch)) {
860
775
  break;
861
776
  }
862
777
  next();
@@ -1032,7 +947,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
1032
947
  if (is_digit(code)) return read_num();
1033
948
  if (PUNC_CHARS.has(ch)) return token("punc", next());
1034
949
  if (OPERATOR_CHARS.has(ch)) return read_operator();
1035
- if (code == 92 || is_identifier_start(ch)) return read_word();
950
+ if (code == 92 || is_identifier_start_broad(ch)) return read_word();
1036
951
  if (code == 35) return read_private_word();
1037
952
  break;
1038
953
  }
@@ -2428,7 +2343,7 @@ function parse($TEXT, options) {
2428
2343
  return new_(allow_calls);
2429
2344
  }
2430
2345
  if (is("name", "import") && is_token(peek(), "punc", ".")) {
2431
- return import_meta(allow_calls);
2346
+ return parse_import_expr(allow_calls);
2432
2347
  }
2433
2348
  var start = S.token;
2434
2349
  var peeked;
@@ -2868,6 +2783,17 @@ function parse($TEXT, options) {
2868
2783
  function import_statement() {
2869
2784
  var start = prev();
2870
2785
 
2786
+ // import source x from "..."
2787
+ // import defer * as x from "..."
2788
+ var phase = null;
2789
+ if (is("name", "source") || is("name", "defer")) {
2790
+ var peeked = peek();
2791
+ if (!is_token(peeked, "name", "from") && !is_token(peeked, "punc", ",")) {
2792
+ phase = S.token.value;
2793
+ next();
2794
+ }
2795
+ }
2796
+
2871
2797
  var imported_name;
2872
2798
  var imported_names;
2873
2799
  if (is("name")) {
@@ -2902,14 +2828,33 @@ function parse($TEXT, options) {
2902
2828
  end: mod_str,
2903
2829
  }),
2904
2830
  attributes,
2831
+ phase,
2905
2832
  end: S.token,
2906
2833
  });
2907
2834
  }
2908
2835
 
2909
- function import_meta(allow_calls) {
2836
+ // import.meta
2837
+ // import.source("module")
2838
+ // import.defer("module")
2839
+ function parse_import_expr(allow_calls) {
2910
2840
  var start = S.token;
2911
2841
  expect_token("name", "import");
2912
2842
  expect_token("punc", ".");
2843
+ if (is("name", "source") || is("name", "defer")) {
2844
+ var phase = S.token.value;
2845
+ next();
2846
+ if (!is("punc", "(")) {
2847
+ croak("'import." + phase + "' can only be used in a dynamic import");
2848
+ }
2849
+ next();
2850
+ var args = expr_list(")");
2851
+ return subscripts(new AST_DynamicImport({
2852
+ start: start,
2853
+ phase: phase,
2854
+ args: args,
2855
+ end: prev()
2856
+ }), allow_calls);
2857
+ }
2913
2858
  expect_token("name", "meta");
2914
2859
  return subscripts(new AST_ImportMeta({
2915
2860
  start: start,
@@ -3613,17 +3558,10 @@ function parse($TEXT, options) {
3613
3558
  }
3614
3559
 
3615
3560
  export {
3616
- get_full_char_code,
3617
- get_full_char,
3618
- is_identifier_char,
3619
- is_basic_identifier_string,
3620
- is_identifier_string,
3621
- is_surrogate_pair_head,
3622
- is_surrogate_pair_tail,
3623
- js_error,
3561
+ ALL_RESERVED_WORDS,
3624
3562
  JS_Parse_Error,
3625
- parse,
3626
3563
  PRECEDENCE,
3627
- ALL_RESERVED_WORDS,
3564
+ js_error,
3565
+ parse,
3628
3566
  tokenizer,
3629
3567
  };