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/CHANGELOG.md +10 -0
- package/dist/bundle.min.js +320 -113
- package/lib/ast.js +38 -1
- package/lib/compress/drop-side-effect-free.js +7 -0
- package/lib/compress/evaluate.js +6 -3
- package/lib/compress/index.js +1 -1
- package/lib/compress/inference.js +5 -0
- package/lib/equivalent-to.js +9 -1
- package/lib/mozilla-ast.js +25 -3
- package/lib/output.js +75 -6
- package/lib/parse.js +51 -113
- package/lib/size.js +6 -0
- package/lib/unicode.js +125 -0
- package/package.json +2 -2
- package/tools/domprops.js +1 -0
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);
|
package/lib/compress/evaluate.js
CHANGED
|
@@ -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
|
|
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 === "
|
|
299
|
+
&& (this.operator === "/" && Number(right) === 0
|
|
300
|
+
|| this.operator === ">>>"
|
|
301
|
+
|| this.operator === "**")
|
|
299
302
|
) {
|
|
300
303
|
return this;
|
|
301
304
|
}
|
package/lib/compress/index.js
CHANGED
|
@@ -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
|
});
|
package/lib/equivalent-to.js
CHANGED
|
@@ -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
|
|
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
|
};
|
package/lib/mozilla-ast.js
CHANGED
|
@@ -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 "./
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 ((
|
|
541
|
-
&& (
|
|
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 (
|
|
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 (!
|
|
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 !== "\\" && !
|
|
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 (!
|
|
755
|
+
if (!is_identifier_start_broad(ch)) {
|
|
841
756
|
parse_error("First identifier char is an invalid identifier char");
|
|
842
757
|
}
|
|
843
|
-
} else if (
|
|
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 (!
|
|
770
|
+
if (!is_identifier_char_broad(ch)) {
|
|
856
771
|
parse_error("Invalid escaped identifier char");
|
|
857
772
|
}
|
|
858
773
|
} else {
|
|
859
|
-
if (!
|
|
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 ||
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3564
|
+
js_error,
|
|
3565
|
+
parse,
|
|
3628
3566
|
tokenizer,
|
|
3629
3567
|
};
|