efront 4.7.3 → 4.8.2

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.
Files changed (47) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +30 -0
  2. package/apps/pay/alipay-query.jsp +2 -2
  3. package/apps/pivot/cert/main.xht +1 -1
  4. package/apps/pivot/cert/orders.xht +7 -1
  5. package/apps/pivot/home/welcome.js +1 -1
  6. package/apps/pivot/main.js +1 -0
  7. package/apps/pivot/wow/root.js +8 -32
  8. package/coms/basic/Speed.js +0 -1
  9. package/coms/basic/Timer.js +15 -0
  10. package/coms/basic/compile_test.js +2 -2
  11. package/coms/basic/cookie.js +2 -2
  12. package/coms/basic/lazy_test.js +2 -2
  13. package/coms/compile/Html.js +23 -6
  14. package/coms/compile/Html_test.js +9 -1
  15. package/coms/compile/Javascript.js +48 -30
  16. package/coms/compile/Program.js +30 -7
  17. package/coms/compile/audit.js +106 -4
  18. package/coms/compile/audit_test.js +8 -1
  19. package/coms/compile/autoenum.js +15 -0
  20. package/coms/compile/common.js +134 -19
  21. package/coms/compile/downLevel.js +11 -3
  22. package/coms/compile/downLevel_test.js +9 -1
  23. package/coms/compile/prefunc.js +38 -0
  24. package/coms/compile/scanner.js +4 -4
  25. package/coms/compile/translate.js +2 -2
  26. package/coms/compile/unstruct.js +1 -33
  27. package/coms/compile/unstruct_test.js +8 -8
  28. package/coms/crypt/encode62.js +1 -1
  29. package/coms/docs/codetext.xht +2 -0
  30. package/coms/frame/chat.js +1 -1
  31. package/coms/kugou/qqjc.js +1 -1
  32. package/coms/pivot/acme2.js +8 -4
  33. package/coms/random//350/272/253/344/273/275/350/257/201.js +1 -1
  34. package/coms/third-party/html2canvas.js +3 -3
  35. package/coms/zimoli/alert.js +3 -0
  36. package/coms/zimoli/lazySwap.js +1 -1
  37. package/coms/zimoli/loading.html +1 -1
  38. package/coms/zimoli/menuList.js +2 -2
  39. package/coms/zimoli/remove.js +1 -0
  40. package/coms/zimoli/sessionStorage.js +1 -1
  41. package/coms/zimoli/speed_test.js +2 -2
  42. package/coms/zimoli/zimoli.js +1 -4
  43. package/docs//345/267/245/345/205/267//345/233/275/351/231/205/345/214/226.xht +19 -9
  44. package/docs//347/273/204/344/273/266.xht +38 -12
  45. package/package.json +1 -1
  46. package/public/efront.js +1 -1
  47. package/apps/pivot/wow/root.less +0 -2
@@ -1,4 +1,4 @@
1
- var { STAMP, getDeclared, VALUE, STRAP, SCOPED, QUOTED, snapSentenceHead, pickSentence, createString, getBodyWith } = require("./common");
1
+ var { STAMP, EXPRESS, STRAP, isHalfSentence, skipAssignment, skipFunction, getDeclared, VALUE, STRAP, SCOPED, QUOTED, snapSentenceHead, pickSentence, createString, getBodyWith, getFuncBody } = require("./common");
2
2
  var addAccessedStart = function (matched, namedMap) {
3
3
  var start = +namedMap["#1"];
4
4
  var body = getBodyWith(matched[0], 'arguments');
@@ -24,18 +24,120 @@ var getLoop = function (c, root) {
24
24
  c = h.queue;
25
25
  } while (c?.type === SCOPED && c !== root)
26
26
  return loop;
27
+ };
28
+ var hasRupt = function (a) {
29
+ if (a.type === STRAP && /^(await|yield)$/.test(a.text)) return true;
30
+ if (a.length) {
31
+ var a = a.first;
32
+ while (a) {
33
+ if (a.type === STRAP && /^(class|function|async)$/.test(a.text)) {
34
+ a = skipFunction(a);
35
+ }
36
+ else if (a.type === STAMP && a.text === '=>') {
37
+ a = skipAssignment(a);
38
+ }
39
+ else if (a.type === SCOPED) {
40
+ if (a.entry === "{") {
41
+ if (!a.isObject) {
42
+ if (hasRupt(a)) return true;
43
+ }
44
+ }
45
+ else {
46
+ if (hasRupt(a)) return true;
47
+ }
48
+ a = a.next;
49
+ }
50
+ else a = a.next;
51
+ }
52
+ }
53
+ return false;
54
+ };
55
+ var getNodePath = function (a, body) {
56
+ var q = a;
57
+ var qs = [];
58
+ while (q && q !== body) {
59
+ qs.push(q);
60
+ q = q.queue;
61
+ }
62
+ return qs.reverse();
63
+ };
64
+ var hasRuptBetween = function (a1, a2) {
65
+ var qp1 = getNodePath(a1);
66
+ var qp2 = getNodePath(a2);
67
+ var qc = [];
68
+ for (var cx = 0, dx = Math.min(qp1.length, qp2.length); cx < dx; cx++) {
69
+ var q1 = qp1[cx];
70
+ if (q1 !== qp2[cx]) break;
71
+ qc.push(q1);
72
+ }
73
+ if (!qc.length) return false;
74
+ var qce = qc.pop();
75
+ var q2 = qp2[cx];
76
+ for (var cx = qce.indexOf(q1), dx = qce.indexOf(q2) + 1 || qce.length; cx < dx; cx++) {
77
+ var q = qce[cx];
78
+ if (hasRupt(q)) return true;
79
+ }
80
+ return false;
81
+ }
82
+ var unMultiple = function (matched) {
83
+ var body = getFuncBody(matched[0]);
84
+ if (!body?.prev || body.checked & 0b10) return;
85
+ body.checked |= 0b10;
86
+ var { envs, used } = body.scoped;
87
+ var undec = [];
88
+ for (var k in envs) {
89
+ var w = [];
90
+ for (var o of used[k]) {
91
+ if (o.text !== k) continue;
92
+ if (o.equal && o.next === o.equal) {
93
+ w.push(o);
94
+ }
95
+ }
96
+ if (!w.length) continue;
97
+ for (var cx = 0, dx = w.length; cx < dx; cx++) {
98
+ var loop = getLoop(w[cx]);
99
+ if (loop && hasRupt(loop)) {
100
+ undec.push(k);
101
+ break;
102
+ }
103
+ if (cx > 0 && hasRuptBetween(w[cx - 1], w[cx])) {
104
+ undec.push(k)
105
+ break;
106
+ }
107
+ }
108
+ }
109
+ if (!undec.length) return;
110
+ var h = snapSentenceHead(body.prev);
111
+ matched = [];
112
+ var declared = null;
113
+ while (h && h !== body) {
114
+ if (h.kind) {
115
+ declared = h.text;
116
+ }
117
+ matched.push(h);
118
+ h = h.next;
119
+ }
120
+ if (!declared) {
121
+ declared = h.type & (STRAP | EXPRESS) && /^(module|exports|return)$/.test(h.tack);
122
+ if (!declared) return;
123
+ }
124
+
125
+ matched.suggest = `${createString(matched)}{\r\n // 不建议在可并行执行的函数中更改外部变量,以防并发调用时出现异常\r\n // 建议在可并行函数内声明如下变量,并修改用到这些变量的代码\r\n var ${undec.join(',')};\r\n }`;
126
+ return matched;
27
127
  }
28
128
  var suggest = {
29
129
  "while($2[$1++]!==$3)": "while($1<$2.length&&$2[$1++]!==$3)",
30
130
  "while($2[$1]!==$3)$1++": "while($1<$2.length&&$2[$1]!==$3)$1++",
31
131
  "for(var $1=#1,$2=arguments.length;$1<$2;$1++)": addAccessedStart,
32
132
  "for(var $1=#1;$1<arguments.length;$1++)": addAccessedStart,
133
+ "await": unMultiple,
134
+ "yield": unMultiple,
33
135
  "arguments"(matched) {
34
136
  var m = matched[0];
35
137
  var body = getBodyWith(m, 'arguments');
36
138
  var head = body.prev;
37
- if (!head?.length || body.checked) return;
38
- body.checked = true;
139
+ if (!head?.length || body.checked & 1) return;
140
+ body.checked |= 1;
39
141
  var { used, args } = body.scoped;
40
142
  if (!args?.length) return;
41
143
  var access_start = body.reststart ?? args?.length;
@@ -93,7 +195,7 @@ var suggest = {
93
195
  }
94
196
  matched.suggest = `${createString(matched.slice(0, matched.length - 1))}(){\r\n var[${createString(head)}]=arguments;\r\n // ${i18n`后续代码`}..\r\n }`;
95
197
  return matched;
96
- }
198
+ },
97
199
  };
98
200
 
99
201
  var regSuggest = function (c) {
@@ -26,6 +26,13 @@ async function c() {
26
26
  }
27
27
 
28
28
  // 正则表达式在步进函数中无法并发执行,是efront提取正则所致,目前要由用户手动处理
29
- async function *c() {
29
+ async function* c() {
30
30
  var reg = /a/g;
31
+ }
32
+
33
+ var a;
34
+ async function* c() {
35
+ a = 1;
36
+ await wait();
37
+ a = 2;
31
38
  }
@@ -100,6 +100,9 @@ var maplist = function (u) {
100
100
  }
101
101
  else if (enumtype & REFMOVE) m.wcount++;
102
102
  }
103
+ else {
104
+ if (o.equal) m.wcount++;
105
+ }
103
106
  }
104
107
  else if (enumtype & REFSTRC) {
105
108
  if (o.enumref && o.enumref !== m.enumref) m.wcount++, m.enumref = o.enumref;
@@ -172,6 +175,18 @@ function inCondition(o) {
172
175
  }
173
176
 
174
177
  function enumref(refitem, scoped) {
178
+ if (enumtype === REFMOVE) {
179
+ var c = 0;
180
+ for (var rk in refitem) {
181
+ c++;
182
+ var a = refitem[rk];
183
+ if (a.ccount > 0) return;
184
+ }
185
+ var a = refitem[""];
186
+ if (a && c > 1) {
187
+ if (a.wcount < a.length) return;
188
+ }
189
+ }
175
190
  for (var rk in refitem) {
176
191
  var os = refitem[rk];
177
192
  if (os.wcount !== 1 || os.length < 2) continue;
@@ -36,9 +36,13 @@ var skipAssignment = function (o, cx) {
36
36
  else if (o.type & (SPACE | COMMENT)) o = o.next;
37
37
  var needpunc = false;
38
38
  var qcount = 0;
39
+ var condition = false;
39
40
  var ifdeep = 0;
40
- var labeled = o && o.type === LABEL;
41
- while (o && o.type === LABEL) next();
41
+ var labeled = o && (o.type === LABEL || o.type === STRAP && /^(var|const|let)$/i.test(o.text));
42
+ var skipLabel = function () {
43
+ while (o?.type === LABEL) next();
44
+ };
45
+ skipLabel();
42
46
  loop: while (o) switch (o.type) {
43
47
  case LABEL:
44
48
  if (!ifdeep) break loop;
@@ -51,7 +55,7 @@ var skipAssignment = function (o, cx) {
51
55
  next();
52
56
  break;
53
57
  case ",":
54
- if (!ifdeep && !labeled) break loop;
58
+ if (!ifdeep && !labeled && !condition) break loop;
55
59
  needpunc = false;
56
60
  next();
57
61
  break;
@@ -132,6 +136,7 @@ var skipAssignment = function (o, cx) {
132
136
  if (o.text === 'catch') {
133
137
  next();
134
138
  if (o && o.entry === '(') next();
139
+ skipLabel();
135
140
  needpunc = false;
136
141
  break;
137
142
  }
@@ -147,14 +152,23 @@ var skipAssignment = function (o, cx) {
147
152
  if (ifdeep <= 0) break loop;
148
153
  ifdeep--;
149
154
  needpunc = false;
155
+ skipLabel();
150
156
  next();
151
157
  }
152
158
  else if (/^(if|while|with|switch|try)$/.test(o.text)) {
153
159
  if (o.text === 'if') ifdeep++;
160
+ skipLabel();
154
161
  next();
155
- if (o.entry === "(") next();
162
+ skipLabel();
163
+ if (o?.entry === "(") next();
164
+ skipLabel();
165
+ if (o?.type === SCOPED && o.entry === '{') {
166
+ condition = false;
167
+ }
168
+ else condition = true;
156
169
  }
157
170
  else if (o.text === 'do') {
171
+ skipLabel();
158
172
  next();
159
173
  next();
160
174
  next();
@@ -162,6 +176,7 @@ var skipAssignment = function (o, cx) {
162
176
  else if (o.text === 'for') {
163
177
  next();
164
178
  if (o.type === STRAP && o.text === 'await') next();
179
+ skipLabel();
165
180
  next();
166
181
  }
167
182
  else if (o.text === "class") {
@@ -289,12 +304,15 @@ function snapSentenceHead(o) {
289
304
  p = o.prev;
290
305
  if (!p) break;
291
306
  }
292
- else if (p.type === STRAP) {
293
- var pp = getContitionHeadBeforeScoped(o, false);
294
- if (pp) { o = pp; break; }
295
- pp = getFunctionHeadBeforeScoped(o);
296
- if (pp) { o = pp; continue };
297
- }
307
+ var pp = getContitionHeadBeforeScoped(o, false);
308
+ if (pp) { o = pp; break; }
309
+ pp = getFunctionHeadBeforeScoped(o);
310
+ if (pp) {
311
+ o = pp;
312
+ p = o.prev;
313
+ if (!p || p.type === STAMP && /^[,;]$/.test(p.text)) break;
314
+ continue
315
+ };
298
316
  }
299
317
  var maybeprop = o.type === SCOPED && o.entry !== "{" || o.type === EXPRESS && /^[\.\[]/.test(o.text);
300
318
  if (p.type === EXPRESS) {
@@ -325,7 +343,12 @@ function snapSentenceHead(o) {
325
343
  var pp = getContitionHeadBeforeScoped(p, true);
326
344
  if (pp) { o = pp; break; }
327
345
  var pp = getFunctionHeadBeforeScoped(p);
328
- if (pp) { o = pp; continue; }
346
+ if (pp) {
347
+ o = pp;
348
+ p = o.prev;
349
+ if (!p || p.type === STAMP && /^[,;]$/.test(p.text)) break;
350
+ continue;
351
+ }
329
352
  }
330
353
  break;
331
354
  }
@@ -361,7 +384,7 @@ function snapSentenceHead(o) {
361
384
  if (/^[\?\:]$/.test(p.text)) {
362
385
  if (o) {
363
386
  var e = snapExpressFoot(o).next;
364
- if (e.type === STAMP && equal_reg.test(e.text)) break;
387
+ if (!e || e.type === STAMP && equal_reg.test(e.text)) break;
365
388
  }
366
389
  }
367
390
  if (/^(?:[!~]|\+\+|\-\-)$/.test(p.text)) {
@@ -375,11 +398,6 @@ function snapSentenceHead(o) {
375
398
  o = p;
376
399
  continue;
377
400
  }
378
- var pp = p.prev;
379
- if (pp.type === STAMP && /^(\+\+|\-\-)$/.test(pp.text) && pp.prev) {
380
- o = pp.prev;
381
- continue;
382
- }
383
401
  o = p.prev;
384
402
  continue;
385
403
  }
@@ -541,6 +559,7 @@ var createScoped = function (parsed, wash) {
541
559
  case VALUE:
542
560
  if (o.isdigit || /^(null|false|true)$/.test(o.text)) break;
543
561
  case EXPRESS:
562
+ if (needhead_reg.test(o.text)) break;
544
563
  // if (o.text === 'readFileAsync') console.log(o)
545
564
  if (o.prev && o.prev.type === EXPRESS) {
546
565
  if (/\.$/.test(o.prev.text)) break;
@@ -548,6 +567,7 @@ var createScoped = function (parsed, wash) {
548
567
  if (o.next && o.next.type === STAMP && o.next.text === "=>") {
549
568
  isScope = true;
550
569
  isArrow = true;
570
+ isAsync = o.prev?.type === STRAP && o.prev.text === 'async';
551
571
  }
552
572
  else {
553
573
  var u = o.text;
@@ -569,7 +589,7 @@ var createScoped = function (parsed, wash) {
569
589
  name = name.replace(/\s*\:$/, '');
570
590
  vars[name] = true;
571
591
  o.kind = "label";
572
- saveTo(used, name, o);
592
+ saveTo(labelused, name, o);
573
593
  break;
574
594
 
575
595
  case STRAP:
@@ -663,7 +683,7 @@ var createScoped = function (parsed, wash) {
663
683
  if (o.next && o.next.type === STAMP && o.next.text === "=>") {
664
684
  isArrow = true;
665
685
  isScope = true;
666
- if (o.prev && o.prev.text === 'async') {
686
+ if (o.prev?.type === STRAP && o.prev.text === 'async') {
667
687
  isAsync = true;
668
688
  }
669
689
  }
@@ -801,6 +821,7 @@ var createScoped = function (parsed, wash) {
801
821
  }
802
822
  else if (isArrow) {
803
823
  var next = skipAssignment(o);
824
+ scoped.arraw = o;
804
825
  var u = o;
805
826
  while (o !== next) {
806
827
  var n = run(o, 0);
@@ -1047,6 +1068,7 @@ var saveTo = function (used, k, o) {
1047
1068
  k = uncode(k);
1048
1069
  if (!(used[k] instanceof Array)) used[k] = [];
1049
1070
  used[k].push(o);
1071
+ o.tack = k;
1050
1072
  };
1051
1073
 
1052
1074
  var mergeTo = function (used, used0) {
@@ -1114,6 +1136,27 @@ var relink = function (list) {
1114
1136
  list.last = p;
1115
1137
  return list;
1116
1138
  };
1139
+ var rehead = function (list) {
1140
+ for (var cx = 0, dx = list.length; cx < dx; cx++) {
1141
+ var o = list[cx];
1142
+ if (o.type & (COMMENT | SPACE)) {
1143
+ o.prev = null;
1144
+ continue;
1145
+ }
1146
+ list.first = o;
1147
+ break;
1148
+ }
1149
+ for (var cx = list.length - 1; cx >= 0; cx--) {
1150
+ var o = list[cx];
1151
+ if (o.type & (COMMENT | SPACE)) {
1152
+ o.last = null;
1153
+ continue;
1154
+ }
1155
+ list.last = o;
1156
+ break;
1157
+ }
1158
+ return list;
1159
+ }
1117
1160
  var setqueue = function (list, queue = list) {
1118
1161
  /**
1119
1162
  * @type {PropertyDescriptor}
@@ -1219,6 +1262,9 @@ var createString = function (parsed) {
1219
1262
  }
1220
1263
  }
1221
1264
  intag = 0;
1265
+ if (o.short && attributes.length > 0 && !(lasttype & (SPACE | QUOTED))) {
1266
+ if (!/[\s'"]$/.test(result[result.length - 1])) result.push(' ');
1267
+ }
1222
1268
  }
1223
1269
  if (o.closed) {
1224
1270
  if (!o.short) {
@@ -1521,6 +1567,25 @@ var pickSentence = function (o) {
1521
1567
  } while (h !== e);
1522
1568
  return res;
1523
1569
  };
1570
+ var pickExpress = function (o) {
1571
+ o = snapExpressFoot(o);
1572
+ var e = snapExpressFoot(o);
1573
+ var os = [];
1574
+ do {
1575
+ os.push(o);
1576
+ }
1577
+ while (o && o !== e);
1578
+ return os;
1579
+ };
1580
+ var pickAssignment = function (n) {
1581
+ var e = skipAssignment(n);
1582
+ var values = [];
1583
+ while (n && n !== e) {
1584
+ values.push(n);
1585
+ n = n.next;
1586
+ }
1587
+ return values;
1588
+ }
1524
1589
  var insertBefore = function () {
1525
1590
  var [o] = arguments;
1526
1591
  var queue = this || o.queue;
@@ -1565,12 +1630,57 @@ var unshort = function (o, text) {
1565
1630
  o.type = EXPRESS;
1566
1631
  delete o.short;
1567
1632
  };
1633
+ var getFuncBody = function (o) {
1634
+ var q = o.queue;
1635
+ while (q && !(q.scoped?.isfunc)) q = q.queue;
1636
+ return q;
1637
+ };
1568
1638
  var getBodyWith = function (o, k) {
1569
1639
  var q = o.queue;
1570
1640
  while (q && (!q.scoped || !q.scoped.caps[k])) q = q.queue;
1571
1641
  return q;
1572
1642
  };
1573
1643
 
1644
+
1645
+ var createSeeker = function (o) {
1646
+ var os = pickExpress(o);
1647
+ var ids = [];
1648
+ for (var o of os) {
1649
+ if (o.type === SCOPED) {
1650
+ if (o.entry !== '[') break;
1651
+ var t = o.last;
1652
+ if (!t) throw new Error(i18n`格式错误`);
1653
+ if (t.type === QUOTED) {
1654
+ if (!t.length) {
1655
+ if (/\.|^#/.test(t.text)) {
1656
+ ids.push(`[${t.text}]`);
1657
+ }
1658
+ else {
1659
+ ids.push(strings.decode(t.text));
1660
+ }
1661
+ }
1662
+ else {
1663
+ ids.push("...");
1664
+ break;
1665
+ }
1666
+ }
1667
+ }
1668
+ else if (o.type === EXPRESS) {
1669
+ var t = o.text.replace(/^\.\.\./, "").replace(/^[^\.\[]+/, '');
1670
+ t.replace(/[^\.\[]+|\[[\s\S]*?\]/g, function (m) {
1671
+ if (/^\[/.test(m)) {
1672
+ ids.push(strings.decode(m.slice(1, -1)));
1673
+ }
1674
+ else {
1675
+ ids.push(m);
1676
+ }
1677
+ })
1678
+ }
1679
+
1680
+ }
1681
+ return ids;
1682
+ };
1683
+
1574
1684
  var patchArrawScope = function (arraw, origin) {
1575
1685
  var s1 = createScoped(arraw);
1576
1686
  if (s1.caps.this) {
@@ -1604,6 +1714,7 @@ module.exports = {
1604
1714
  skipAssignment,
1605
1715
  getDeclared,
1606
1716
  getBodyWith,
1717
+ getFuncBody,
1607
1718
  patchArrawScope,
1608
1719
  remove,
1609
1720
  createString,
@@ -1612,6 +1723,8 @@ module.exports = {
1612
1723
  snapSentenceHead,
1613
1724
  pickArgument,
1614
1725
  pickSentence,
1726
+ pickExpress,
1727
+ pickAssignment,
1615
1728
  snapExpressHead,
1616
1729
  snapExpressFoot,
1617
1730
  skipSentenceQueue,
@@ -1620,6 +1733,8 @@ module.exports = {
1620
1733
  isEval,
1621
1734
  rename,
1622
1735
  relink,
1736
+ rehead,
1737
+ createSeeker,
1623
1738
  setqueue,
1624
1739
  replace,
1625
1740
  canbeTemp,
@@ -1,7 +1,7 @@
1
1
  var scanner2 = require("./scanner2");
2
2
  var strings = require("../basic/strings");
3
3
  var Program = scanner2.Program;
4
- var { STAMP, SCOPED, STRAP, EXPRESS, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, snapExpressFoot, isEval, canbeTemp, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, snapExpressHead, needBreakBetween } = require("./common");
4
+ var { STAMP, SCOPED, STRAP, EXPRESS, pickAssignment, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, snapExpressFoot, isEval, canbeTemp, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, snapExpressHead, needBreakBetween } = require("./common");
5
5
  var splice2 = function (q, from, to, ...a) {
6
6
  var cx = q.indexOf(from);
7
7
  if (cx < 0) throw console.log(splice2.caller, console.format(`\r\n<red2>${i18n`自`}</red2>`), from && createString([from]), console.format(`\r\n<yellow>${i18n`至`}</yellow>`), to && createString([to]), console.format(`\r\n<cyan>${i18n`码列`}</cyan>`), createString(q)), i18n`结构异常`;
@@ -1721,13 +1721,19 @@ var down = function (scoped) {
1721
1721
  fordeep = saveddeep;
1722
1722
  };
1723
1723
  if (scoped.isfunc) {
1724
- if (!scoped.body && scoped.head) scoped.body = scoped.head.next;
1724
+ if (!scoped.body && scoped.head?.next?.type === SCOPED && scoped.head.next.entry === "{") scoped.body = scoped.head.next;
1725
1725
  if (scoped.head) var [argsmap, argcodes] = killarg(scoped.head, scoped.body, _letname, false);
1726
1726
  else argcodes = [];
1727
1727
  if ((markcodes.length || argcodes.length) && !funcMark) precode(markcodes.concat(argcodes).join(";") + ";");
1728
1728
  if (scoped.body) scoped.body.keeplet = false, _killobj(_getname, scoped.body);
1729
-
1730
1729
  scoped.forEach(kill);
1730
+ var requeue = null, requeuei = -1, requeuee = -1;
1731
+ if (!scoped.body && scoped.arraw) {
1732
+ requeue = scoped.arraw.queue;
1733
+ requeuei = requeue.indexOf(scoped.arraw);
1734
+ scoped.body = pickAssignment(scoped.arraw);
1735
+ requeuee = requeue.indexOf(scoped.body[scoped.body.length - 1], requeuei) + 1;
1736
+ }
1731
1737
  if (funcMark) {
1732
1738
  var argname = _letname("_");
1733
1739
  unstruct.debug = downLevel.debug;
@@ -1761,6 +1767,8 @@ var down = function (scoped) {
1761
1767
  if (argsmap) vars1 = vars1.filter(k => !(k in argsmap));
1762
1768
  if (vars1.length && scoped.body) scoped.body.push(...scanner2(`\r\nvar ${vars1}`));
1763
1769
  if (scoped.body) relink(scoped.body);
1770
+
1771
+ if (requeuei >= 0) splice(requeue, requeuei, requeuee - requeuei, ...scoped.body);
1764
1772
  }
1765
1773
  else {
1766
1774
  kill(scoped);
@@ -85,7 +85,7 @@ assert(downLevel(`class a { static{ a.a=1}}`), "function a() {}; (function () {
85
85
  assert(downLevel(`if(a) a = 1; class a {}`), "if (a) a = 1; function a() {}")
86
86
  assert(downLevel(`async function(){if(a) a = 1; class a {}}`), `function () { return async_(
87
87
  function () {
88
- a = function a() {}; if (!a) return [1, 0]; a = 1; return [1, 0]
88
+ a = function () {}; if (!a) return [1, 0]; a = 1; return [1, 0]
89
89
  })
90
90
  var a, _0 }`)
91
91
  assert(downLevel(`if(a) class b{ c(){}};`), `if (a) var b = function (b) { b["prototype"].c = function () {}\r\nreturn b }(function b() {});`)
@@ -424,3 +424,11 @@ function (_) {
424
424
  _0 = _; _0 = _0.a; a = _0
425
425
  })
426
426
  var a, _0`)
427
+
428
+ assert(downLevel(`async a=>await a`), `function (a) { return return async_(
429
+ function () {
430
+ _0 = a; return [_0, 1]
431
+ })
432
+ var a, _0 }`)
433
+
434
+ assert(downLevel(`function(a=b=>b,c){c}`), 'function (a, c) { if (a === undefined) a = function (b) { return b }; c }')
@@ -0,0 +1,38 @@
1
+ var { COMMENT, SPACE, STRAP, EXPRESS, STAMP, skipAssignment, isHalfSentence, splice } = common;
2
+ // 将当前代码队列中的function及class声明提前
3
+ var prefunc = function (sbody) {
4
+ var fx = 0;
5
+ for (var cx = 0, dx = sbody.length; cx < dx; cx++) {
6
+ var o = sbody[cx];
7
+ var bx = cx;
8
+ while (o && o.type & (SPACE | COMMENT)) o = sbody[++cx];
9
+ if (!o) break;
10
+ if (o.type === STRAP && /^(async|function|class)$/.test(o.text)) {
11
+ if (!o.isExpress) {
12
+ var ex = skipAssignment(sbody, cx);
13
+ var fname = '';
14
+ o = o.next;
15
+ while (o.type & (STRAP | STAMP)) o = o.next;
16
+ if (o.type === EXPRESS) fname = o.text;
17
+ if (fname) {
18
+ var ni = sbody.indexOf(o, cx);
19
+ splice(sbody, ni, 1);
20
+ if (isHalfSentence(sbody, cx - 1)) {
21
+ splice(sbody, cx, 0, o, { type: STAMP, text: "=" });
22
+ ex++;
23
+ dx++;
24
+ }
25
+ else {
26
+ var sb = splice(sbody, bx, ex - bx);
27
+ splice(sbody, fx, 0, { type: SPACE, text: "\r\n" }, o, { type: STAMP, text: "=" }, ...sb);
28
+ fx += ex - bx + 2;
29
+ ex += 2;
30
+ dx += 2;
31
+ }
32
+ }
33
+ cx = ex;
34
+ continue;
35
+ }
36
+ }
37
+ }
38
+ };
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  function test(test, count) {
3
- var time = Date.now();
3
+ var time = +new Date;
4
4
  if (test instanceof Function) {
5
5
  while (count-- > 0) {
6
6
  test();
7
7
  }
8
8
  }
9
- return Date.now() - time;
9
+ return new Date - time;
10
10
  }
11
11
  // - function () {
12
12
  // single_comment_scanner.call("'", 0) === 1;
@@ -622,11 +622,11 @@ function lookback_scanner(blockIndex, blocks) {
622
622
  var scanner = module.exports = function (s, keepdeep) {
623
623
  var blocks = [];
624
624
  var s = String(s);
625
- // var time = Date.now();
625
+ // var time = +new Date;
626
626
  // for (var i = 0; i < 1000; i++) {
627
627
  // block_code_scanner.call(s, 0, blocks);
628
628
  // }//angular 1.5.3 x1000 7.0s
629
- // console.log(Date.now() - time);
629
+ // console.log(+new Date - time);
630
630
  block_code_scanner.call(s, 0, blocks, keepdeep);
631
631
  // console.log(blocks.map(a => s.slice(a.start, a.end)).join())
632
632
  return blocks;
@@ -110,7 +110,7 @@ function translate([imap, supports], code) {
110
110
 
111
111
  var imp = imap[tt];
112
112
  if (!imp) {
113
- if (warn !== false && !warningMap[tt]) warningMap[tt] = true, console.warn(`<yellow>${i18n`翻译缺失:`}</yellow>${tt}`);
113
+ if (warn !== false && !/^\s*$/.test(tt) && !warningMap[tt]) warningMap[tt] = true, console.warn(`<yellow>${i18n`翻译缺失:`}</yellow>${tt}`);
114
114
  imp = imap[tt] = supports.map(_ => tt);
115
115
  }
116
116
  if (nodup && imp.length <= 1) nodup = false;
@@ -158,7 +158,7 @@ function translate([imap, supports], code) {
158
158
  if (a in t) v = t[a];
159
159
  else v = scanner2(JSON.stringify(v));
160
160
  }
161
- else if (k === 'name') v = ctn('i18n' + getm(v, t.nodup, t.warn), t);
161
+ else if (/^(name|holder|comment)$/.test(k)) v = ctn('i18n' + getm(v, t.nodup, t.warn), t);
162
162
  else v = scanner2(JSON.stringify(v));
163
163
  o.push({ type: PROPERTY, isprop: true, text: JSON.stringify(k) }, { type: STAMP, text: ':' }, ...v, { type: STAMP, text: ',' });
164
164
  })