efront 3.38.2 → 4.0.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.
@@ -1,6 +1,6 @@
1
1
  # efront 兼容性说明
2
2
  * `coms/basic_`目录的代码均为非标准实现,如果你要兼容低版本的运行环境,尽量避免使用高级的功能
3
- * 当前的`efront`进行代码降级时用到了`typescript`,所以下文有些问题的描述会误伤`typescript`,不用觉得奇怪。
3
+ * 3.x及以前版本的`efront`进行代码降级时用到了`typescript`,所以下文有些问题的描述会误伤`typescript`,不用觉得奇怪。
4
4
  * 已知在转换成低版本代码后与高级版本有区别的语法如下:
5
5
  1. ```javascript
6
6
  class ... extends Array {...}
@@ -248,21 +248,30 @@ function snapSentenceHead(o) {
248
248
  }
249
249
  return o;
250
250
  }
251
-
251
+ var getStrapHead = function (o) {
252
+ var p = o.prev;
253
+ if (p && p.type === STRAP && !p.transive) return p;
254
+ if (p && p.type === STRAP && p.text === 'await') p = p.prev;
255
+ if (p && p.type === STRAP && p.text === 'for') return p;
256
+ return null;
257
+ }
252
258
  var snapExpressHead = function (o) {
253
259
  if (!o || o.type & ~(EXPRESS | SCOPED | QUOTED)) return o;
254
260
  var a = o;
255
261
  while (o && o.prev) {
256
262
  var p = o.prev;
257
263
  if (p && p.type === STRAP && p.text === 'new') return p;
264
+ if (o.type === SCOPED && o.entry === '(') {
265
+ var h = getStrapHead(o);
266
+ if (h) return h;
267
+ }
258
268
  if (o.type === SCOPED && o.entry !== '{'
259
269
  || o.type === EXPRESS && /^(\??\.[^\.]|\[)/.test(o.text)
260
270
  || /\.$/.test(p.text) && !p.isdigit
261
271
  || o.type === QUOTED && (o.length || /^\`/.test(o.text))
262
272
  ) {
263
273
  if (p.type === SCOPED && p.entry === '(') {
264
- var pp = p.prev;
265
- if (pp && pp.type === STRAP && !p.transive) return o;
274
+ if (getStrapHead(p)) return o;
266
275
  }
267
276
  if (p.type & (EXPRESS | VALUE | QUOTED | SCOPED)) {
268
277
  a = o;
@@ -526,6 +535,10 @@ var createScoped = function (parsed, wash) {
526
535
  break;
527
536
  case "for":
528
537
  o = o.next;
538
+ if (o.type === STRAP && o.text === 'await') {
539
+ funcbody.async = funcbody.await = true;
540
+ o = o.next;
541
+ }
529
542
  isScope = true;
530
543
  break;
531
544
 
@@ -24,7 +24,7 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
24
24
  var dp = 0;
25
25
  if (typeof k === 'number' && k < 0) {
26
26
  dp = 1;
27
- k = `${tmpname}.length>${doged - k - 1}?${tmpname}[${tmpname}.length - ${-k}]:undefined`;
27
+ k = `${tmpname}["length"]>${doged - k - 1}?${tmpname}[${tmpname}["length"] - ${-k}]:undefined`;
28
28
  } else {
29
29
  k = tmpname + k;
30
30
  }
@@ -123,12 +123,12 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
123
123
  map[a] = a;
124
124
  });
125
125
  d.attributes.forEach(dec);
126
- write(name, `rest_(${tmpname},[${Object.keys(map)}])`, false);
126
+ write(name, `rest_(${tmpname},[${Object.keys(map)}])`, false), rootenvs.rest_ = true;
127
127
  }
128
128
  else {
129
129
  doged = at + 1;
130
130
  head.forEach(dec);
131
- write(name, `Array.prototype.slice.call(${tmpname},${at}${a > at ? `,${at - a}` : ''})`, rest.length > 0);
131
+ write(name, `slice_["call"](${tmpname},${at}${a > at ? `,${at - a}` : ''})`, rest.length > 0), rootenvs.slice_ = true;
132
132
  doged = at + 1;
133
133
  total = rest.length;
134
134
  rest.forEach(dec);
@@ -245,7 +245,7 @@ var killmap = function (body, i, _getobjname, killobj) {
245
245
  s = m, p = m.prev;
246
246
  if (m.type === EXPRESS) break;
247
247
  while (m && (m.type === STRAP || m.type === STAMP)) m = m.next;
248
- if (!m || m.isprop && (m.type === SCOPED || m.type === PROPERTY && /\[/.test(m.text) || m.short || m.next && m.next.type === SCOPED)) {
248
+ if (!m || m.type & (PROPERTY | QUOTED | EXPRESS) && /^\[/.test(m.text) || m.isprop && (m.type === SCOPED || m.short || m.next && m.next.type === SCOPED)) {
249
249
  break;
250
250
  }
251
251
  m = m.next;
@@ -425,10 +425,12 @@ var setprop = function (prop, k, d, q) {
425
425
  else pe = null;
426
426
  }
427
427
  if (!d[prop.name]) {
428
- let tmp = scanner2(`\r\nObject.defineProperty(${k},${prop.name},{})`);
428
+ let tmp = scanner2(`\r\nObject["defineProperty"](${k},${prop.name},{})`);
429
429
  insert1(q, null, ...tmp);
430
430
  if (pe) insert1(q, null, pe);
431
- d[prop.name] = tmp[tmp.length - 1][4];
431
+ tmp = tmp[tmp.length - 1];
432
+ tmp = tmp[tmp.length - 1];
433
+ d[prop.name] = tmp;
432
434
  }
433
435
  if (d[prop.name].length) insert1(d[prop.name], null, { type: STAMP, text: ',' });
434
436
  insert1(d[prop.name], null, { type: PROPERTY, text: prop.get ? "get" : "set" });
@@ -489,7 +491,7 @@ var killcls = function (body, i, getname_) {
489
491
  while (m) {
490
492
  var [prop, m] = getprop(o, m);
491
493
  if (!prop.value.length) prop.value = scanner2('undefined;');
492
- var k = prop.static ? clz.name : `${clz.name}.prototype`;
494
+ var k = prop.static ? clz.name : `${clz.name}["prototype"]`;
493
495
  var d = prop.static ? static_ : define_;
494
496
  if (prop.get || prop.set || prop.static) {
495
497
  setprop(prop, k, d, defines);
@@ -518,16 +520,16 @@ var killcls = function (body, i, getname_) {
518
520
  if (cs.used.this) rename(cs.used, 'this', newt);
519
521
  var inited = false;
520
522
  assign.forEach(o => {
521
- if (o.type === EXPRESS) o.text = o.text.replace(/^this\./g, newt);
523
+ if (o.type === EXPRESS) o.text = o.text.replace(/^this([\[\.]|$)/g, newt + "$1");
522
524
  });
523
525
  if (cs.used.super) {
524
526
  cs.used.super.forEach(o => {
525
527
  if (o.text !== 'super') return;
526
528
  var n = o.next;
527
529
  if (!n || n.type !== SCOPED || n.entry !== "(") return;
528
- o.text = base + '.call';
530
+ o.text = base + '["call"]';
529
531
  if (!inited) {
530
- insert1(o.queue, o, ...assign);
532
+ insert1(o.queue, skipAssignment(o), ...assign);
531
533
  }
532
534
  inited = true;
533
535
  insert1(o.queue, o, ...scanner2(`var ${newt}=`));
@@ -539,11 +541,11 @@ var killcls = function (body, i, getname_) {
539
541
  if (scoped.used.super) {
540
542
  scoped.used.super.forEach(o => {
541
543
  if (!/^super(\.|\[|$)/.test(o.text)) return;
542
- o.text = `${base}.prototype` + o.text.replace(/^super/, '');
543
- insert1(o.queue, o.next, ...scanner2('.bind(this)'));
544
+ o.text = `${base}["prototype"]` + o.text.replace(/^super/, '');
545
+ insert1(o.queue, o.next, ...scanner2('["bind"](this)'));
544
546
  })
545
547
  }
546
- if (!inited) constructor[1].unshift(...scanner2(`\r\nvar ${newt}=${base}.apply(this,arguments)||this;\r\n`), ...assign);
548
+ if (!inited) constructor[1].unshift(...scanner2(`\r\nvar ${newt}=${base}["apply"](this,arguments)||this;\r\n`), ...assign);
547
549
  }
548
550
  else {
549
551
  constructor[1].unshift(...assign);
@@ -582,7 +584,7 @@ var indexof = function (list, o, i) {
582
584
  return i;
583
585
  };
584
586
  // 数组或参数展开
585
- var killspr = function (body, i, _getobjname, setsolid, killobj) {
587
+ var killspr = function (body, i, _getobjname, killobj) {
586
588
  var o = body[i];
587
589
  var m = o.first;
588
590
  if (!m) return i + 1;
@@ -592,12 +594,12 @@ var killspr = function (body, i, _getobjname, setsolid, killobj) {
592
594
  var s = m;
593
595
  s.text = s.text.replace(/^\.\.\./, '');
594
596
  m = skipAssignment(m);
595
- var q = scanner2(`Array.prototype.slice.call()`);
597
+ var q = scanner2(`slice_["call"]()`);
598
+ rootenvs.slice_ = true;
596
599
  var v = splice2(o, s, m);
597
600
  if (m) splice2(o, m, m = m.next);
598
601
  killobj(v);
599
- insert1(q[1], null, ...v);
600
- setsolid(q, q[0]);
602
+ insert1(q[q.length - 1], null, ...v);
601
603
  return q;
602
604
  };
603
605
  var killnext = function (m) {
@@ -613,11 +615,12 @@ var killspr = function (body, i, _getobjname, setsolid, killobj) {
613
615
  index++;
614
616
  }
615
617
  if (!m) return i + 1;
616
- var c = scanner2('.concat()');
618
+ var c = scanner2('["concat"]()');
617
619
  var next = o.next;
618
620
  if (o.entry === '(') {
619
621
  var r = snapExpressHead(o);
620
622
  var rt = r.type === EXPRESS && r.text.replace(/^\.\.\./, '');
623
+ var p = o.prev;
621
624
  if (r === o);
622
625
  else if (
623
626
  r === o.prev && r.type === EXPRESS && !/\.[\s\S]*\./.test(rt) && !/\[[^\]]*\]\[[^\]]*\]/.test(rt)) {
@@ -625,8 +628,12 @@ var killspr = function (body, i, _getobjname, setsolid, killobj) {
625
628
  var n = /\.|\[/.test(rt) ? rt.replace(/\.[^\.]*|\[[^\]]*\]$/, '') : "null";
626
629
  splice(o, 0, 0, ...scanner2(n + ","));
627
630
  }
631
+ else if (p && r === p.prev && p.type === SCOPED && p.entry === "[" && !/[\.\[]/.test(rt)) {
632
+ splice(o, 0, 0, ...scanner2(rt + ","));
633
+ p = r;
634
+ }
628
635
  else {
629
- var p = o.prev, n = null, hasdot = false;
636
+ var n = null, hasdot = false;
630
637
  var pt = p.type === EXPRESS && p.text.replace(/^\.\.\./, '');
631
638
  if (p.type === EXPRESS && (n = /^(?:[\s\S]*[^\.])?(\.[^\.]*|\[[^\]]*\])$/.exec(pt))) {
632
639
  hasdot = p.text.length !== pt.length;
@@ -652,7 +659,7 @@ var killspr = function (body, i, _getobjname, setsolid, killobj) {
652
659
  if (cx >= 0) splice(h1, cx, 1);
653
660
  }
654
661
  }
655
- splice(body, i++, 0, ...scanner2('.apply'));
662
+ splice(body, i++, 0, ...scanner2('["apply"]'));
656
663
  var m1 = skipAssignment(m);
657
664
  if (index > 0 || m1 && m1.next) {
658
665
  var h = splice(o, 2, o.length);
@@ -696,7 +703,7 @@ var killspr = function (body, i, _getobjname, setsolid, killobj) {
696
703
  return indexof(body, next, i);
697
704
  };
698
705
 
699
- var killobj = function (body, getobjname, getletname, getname_, letname_, setsolid, deep = 0) {
706
+ var killobj = function (body, getobjname, getletname, getname_, letname_, deep = 0) {
700
707
  var i = 0;
701
708
  var _getdeep = function () {
702
709
  deep++;
@@ -712,7 +719,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, setsol
712
719
  return getobjname(deep + i);
713
720
  };
714
721
  var deepkill = function (o) {
715
- killobj(o, getobjname, getletname, getname_, letname_, setsolid, deep);
722
+ killobj(o, getobjname, getletname, getname_, letname_, deep);
716
723
  if (o.await_) body.await_ = true;
717
724
  };
718
725
  while (i < body.length) {
@@ -758,9 +765,11 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, setsol
758
765
  case "class":
759
766
  i = killcls(body, i, letname_);
760
767
  break;
768
+ case "for":
761
769
  case "function":
762
770
  o = o.next;
763
- if (o && o.type === STAMP) {
771
+ if (o && o.type === STRAP) o = o.next;
772
+ else if (o && o.type === STAMP) {
764
773
  i++;
765
774
  var n = body.indexOf(o, i) + 1;
766
775
  o = o.next;
@@ -798,7 +807,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, setsol
798
807
  i = killdec(body, i, _getdeepname, '', deepkill);
799
808
  }
800
809
  else {
801
- i = killspr(body, i, _getobjname, setsolid, deepkill);
810
+ i = killspr(body, i, _getobjname, deepkill);
802
811
  }
803
812
  continue;
804
813
  }
@@ -808,11 +817,11 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, setsol
808
817
  var p = o.prev;
809
818
  if (p.transive || /^(if|else|while|with|switch)$/.test(p.text)) deepkill(o);
810
819
  }
811
- else if (!o.prev || o.prev.type === STAMP || o.prev.type === STRAP) {
820
+ else if (!o.prev || o.prev.type & (STAMP | STRAP)) {
812
821
  deepkill(o);
813
822
  }
814
823
  else {
815
- i = killspr(body, i, _getobjname, setsolid, deepkill);
824
+ i = killspr(body, i, _getobjname, deepkill);
816
825
  continue;
817
826
  }
818
827
  }
@@ -936,6 +945,7 @@ var unforof = function (o, getnewname, used) {
936
945
  var hasawait = false;
937
946
  if (o.type === STRAP && o.text === 'await') {
938
947
  hasawait = true;
948
+ splice2(o.queue, o, o.next);
939
949
  o = o.next;
940
950
  }
941
951
  var m = o.first;
@@ -957,7 +967,7 @@ var unforof = function (o, getnewname, used) {
957
967
  var iname = getnewname();
958
968
  var gname = getnewname();
959
969
  var oname;
960
- var useSimpleLoop = !(rootHyper || used.Symbol || hasawait);
970
+ var useSimpleLoop = !(rootHyper || used.Symbol) && !hasawait;
961
971
  if (!f.next && f.type === EXPRESS && !/\./.test(f.text) && used[f.origin || f.text.replace(/[\.\[][\s\S]*$/, '')].length === 1) {
962
972
  splice2(o, m);
963
973
  oname = f.text;
@@ -966,13 +976,13 @@ var unforof = function (o, getnewname, used) {
966
976
  oname = getnewname();
967
977
  splice2(o, n, f);
968
978
  var mo = splice2(o, f);
969
- if (useSimpleLoop) useSimpleLoop = mo.length === 1 && (mo[0].type === EXPRESS || mo[0].type === SCOPED && mo[0].entry === "[");
970
- o.push(...scanner2(`${oname}=`));
971
- o.push(...mo);
972
- o.push({ type: STAMP, text: ',' });
979
+ if (useSimpleLoop && !hasawait) useSimpleLoop = mo.length === 1 && (mo[0].type === EXPRESS || mo[0].type === SCOPED && mo[0].entry === "[");
980
+ splice(o, o.length, 0, ...scanner2(`${oname}=`));
981
+ splice(o, o.length, 0, ...mo);
982
+ splice(o, o.length, 0, { type: STAMP, text: ',' });
973
983
  }
974
- if (useSimpleLoop) o.push(...scanner2(`${iname}=0,${gname}=${oname}.length;${iname}<${gname}&&(${createString([p])}=${oname}[${iname}],true);${iname}++`));
975
- else rootenvs.Symbol = true, o.push(...scanner2(`${gname}=${hasawait ? `${oname}[Symbol.asyncIterator]||${oname}[Symbol.iterator]` : `${oname}[Symbol.iterator]||${oname}[Symbol.asyncIterator]`}||Array.prototype[Symbol.iterator],${gname}=${gname}.call(${oname}),${iname}=${hasawait ? "await " : ''}${gname}.next();!${iname}.done&&(${createString([p])}=${iname}.value,true);${iname}=${gname}.next()`));
984
+ if (useSimpleLoop) splice(o, o.length, 0, ...scanner2(`${iname}=0,${gname}=${oname}["length"];${iname}<${gname}&&(${createString([p])}=${oname}[${iname}],true);${iname}++`));
985
+ else rootenvs.Symbol = true, splice(o, o.length, 0, ...scanner2(`${gname}=${hasawait ? `${oname}[Symbol["asyncIterator"]]||${oname}[Symbol["iterator"]]` : `${oname}[Symbol["iterator"]]||${oname}[Symbol["asyncIterator"]]`}||Array["prototype"][Symbol["iterator"]],${gname}=${gname}["call"](${oname}),${iname}=${hasawait ? "await " : ''}${gname}["next"]();!${iname}["done"]&&(${createString([p])}=${iname}["value"],true);${iname}=${gname}["next"]()`));
976
986
  relink(o);
977
987
  };
978
988
  var unarrow = function (body, i, killobj, letname_) {
@@ -993,7 +1003,7 @@ var unarrow = function (body, i, killobj, letname_) {
993
1003
  if (n.type !== SCOPED || n.entry !== "{") {
994
1004
  var nni = skipAssignment(body, ni);
995
1005
  b = scanner2('{}')[0];
996
- b.push({ type: STRAP, text: "return" }, ...body.splice(ni, nni - ni, b));
1006
+ splice(b, 0, 0, { type: STRAP, transive: true, text: "return" }, ...splice(body, ni, nni - ni, b));
997
1007
  killarg(h, b, letname_);
998
1008
  killobj(b);
999
1009
  ni = nni;
@@ -1056,10 +1066,10 @@ var killarg = function (head, body, _getname, setarg = true) {
1056
1066
  argcodes.unshift.apply(argcodes, anames.map((a, i) => {
1057
1067
  if (a === cname) cname = '';
1058
1068
  var n = anames.length - i;
1059
- return `${a}=arguments.length>${collect + n - 1}?arguments[arguments.length - ${n}]:undefined`;
1069
+ return `${a}=arguments["length"]>${collect + n - 1}?arguments[arguments["length"] - ${n}]:undefined`;
1060
1070
  }));
1061
1071
 
1062
- if (cname) argcodes.unshift(`var ${cname}=Array.prototype.slice.call(arguments,${collect}${index > collect ? `,${collect - index}` : ""})`);
1072
+ if (cname) argcodes.unshift(`var ${cname}=slice_["call"](arguments,${collect}${index > collect ? `,${collect - index}` : ""})`), rootenvs.slice_ = true;
1063
1073
  }
1064
1074
  if (argcodes.length && setarg) {
1065
1075
  if (!body) {
@@ -1315,25 +1325,6 @@ var down = function (scoped) {
1315
1325
  scoped.body.unshift.apply(scoped.body, codelist);
1316
1326
  };
1317
1327
 
1318
- var solidmap = {};
1319
- var setsolid = function (q, o) {
1320
- var k = o.text;
1321
- if (!/\.[\s\S]+\./.test(k)) return;
1322
- var c = k.replace(/^[\s\S]*?(\.[^\.]*$)/, '$1');
1323
- k = k.replace(/^([\s\S]*?)\.[^\.]*$/, '$1');
1324
- if (!solidmap[k]) {
1325
- solidmap[k] = [q, o];
1326
- return;
1327
- }
1328
- if (typeof solidmap[k] !== 'string') {
1329
- var n = k.replace(/^[\s\S]*?([^\.]*)$/, "$1");
1330
- n = _getname(n + "_");
1331
- var [q, b] = solidmap[k];
1332
- b.text = `(${n} = ${k})${c}`;
1333
- solidmap[k] = n;
1334
- }
1335
- o.text = solidmap[k] + c;
1336
- };
1337
1328
  var markcodes = [];
1338
1329
  if (scoped.isfunc && scoped.used.this && (funcMark || scoped.insett)) {
1339
1330
  let tn = _getname("this_");
@@ -1349,9 +1340,9 @@ var down = function (scoped) {
1349
1340
  }
1350
1341
  var fordeep = 0;
1351
1342
  var _killobj = function (_getlocal, o) {
1352
- return killobj(o, gettmpname, getletname, _getlocal, _letname, setsolid);
1343
+ return killobj(o, gettmpname, getletname, _getlocal, _letname);
1353
1344
  };
1354
- var kill = function (scoped, _, body) {
1345
+ var kill = function (scoped, _, parentScope) {
1355
1346
  if (scoped.isfunc) return down(scoped);
1356
1347
  killlet(scoped);
1357
1348
  var saveddeep = fordeep;
@@ -1363,8 +1354,10 @@ var down = function (scoped) {
1363
1354
  a: if (scoped.head) {
1364
1355
  var hp = scoped.head.prev;
1365
1356
  if (hp && hp.type === STRAP) {
1357
+ if (hp && hp.type === STRAP && hp.text === 'await') hp = hp.prev;
1358
+ if (!hp) break a;
1366
1359
  if (hp.text === 'for') {
1367
- unforof(scoped.head, getdeepname, scoped.used);
1360
+ unforof(hp.next, getdeepname, scoped.used);
1368
1361
  killed = unforin(scoped.head, getdeepname, _killobj.bind(null, _getlocal)) !== false;
1369
1362
  // unforcx(scoped.head, getdeepname);
1370
1363
  }
@@ -1380,6 +1373,7 @@ var down = function (scoped) {
1380
1373
  fordeep = saveddeep;
1381
1374
  };
1382
1375
  if (scoped.isfunc) {
1376
+ if (!scoped.body && scoped.head) scoped.body = scoped.head.next;
1383
1377
  if (scoped.head) var [argsmap, argcodes] = killarg(scoped.head, scoped.body, _letname, false);
1384
1378
  else argcodes = [];
1385
1379
  if ((markcodes.length || argcodes.length) && !funcMark) precode(markcodes.concat(argcodes).join(";") + ";");
@@ -1412,6 +1406,7 @@ var down = function (scoped) {
1412
1406
  scoped.yield = false;
1413
1407
  }
1414
1408
  var vars1 = Object.keys(vars).filter(k => !(k in scoped.vars));
1409
+ scoped.vars = vars;
1415
1410
  if (argsmap) vars1 = vars1.filter(k => !(k in argsmap));
1416
1411
  if (vars1.length && scoped.body) scoped.body.push(...scanner2(`\r\nvar ${vars1}`));
1417
1412
  if (scoped.body) relink(scoped.body);
@@ -1433,6 +1428,10 @@ var downcode = downLevel.code = function (code) {
1433
1428
  rootHyper = rootenvs.Symbol || code.yield || code.async;
1434
1429
  down(code.scoped);
1435
1430
  code.keepcolor = false;
1431
+ if (rootenvs.slice_) {
1432
+ delete rootenvs.slice_;
1433
+ if (!code.vars.slice_) splice(code.scoped.body, 0, 0, ...scanner2('var slice_ = Array["prototype"]["slice"];\r\n'));
1434
+ }
1436
1435
  rootenvs = null;
1437
1436
  return code;
1438
1437
  };