efront 3.38.1 → 4.0.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.
@@ -199,11 +199,11 @@ var getString = function (object, filter, space) {
199
199
  while (cx < dx) {
200
200
  key = ks ? ks[cx] : cx;
201
201
  var backlength = str.length;
202
- if (backlength > 1) str += ',';
202
+ if (cx > 0) str += ',';
203
203
  if (space) str += '\n' + new Array(objects.length + 1).join(space);
204
204
  if (ks) {
205
- str += (toString(key) + ":");
206
- if (space) str += (" ");
205
+ str += toString(key) + ":";
206
+ if (space) str += " ";
207
207
  };
208
208
  var v = get(object[key]);
209
209
  if (isObject(v)) {
@@ -221,7 +221,7 @@ var getString = function (object, filter, space) {
221
221
  }
222
222
  if (cx === dx) {
223
223
  if (dx > 0) {
224
- if (space) str += ('\n' + new Array(objects.length).join(space))
224
+ if (space) str += '\n' + new Array(objects.length).join(space)
225
225
  }
226
226
  str += ks ? '}' : ']';
227
227
  pop();
@@ -64,7 +64,7 @@ var test = function (JSON) {
64
64
  var start = new Date();
65
65
  try {
66
66
  var res = call(arg, null, space);
67
- } catch{
67
+ } catch {
68
68
  res = "error";
69
69
  }
70
70
  var delta = new Date - start;
@@ -79,10 +79,88 @@ var test = function (JSON) {
79
79
  });
80
80
 
81
81
  };
82
+ var test2 = function (JSON) {
83
+ var data = [{
84
+ "name": i18n(`\u4ee3\u7406\u8def\u5f84`, `Proxy Path`),
85
+ "type": "input",
86
+ "key": "url",
87
+ "comment": "",
88
+ "size": "120",
89
+ "unit": "bit",
90
+ "ratio": 0.125,
91
+ "required": true
92
+ }, {
93
+ "name": i18n(`\u4e8c\u7ef4\u7801`, `QR code`),
94
+ "type": "1byte",
95
+ "key": "url",
96
+ "comment": "",
97
+ "size": "1",
98
+ "unit": "byte",
99
+ "ratio": 1,
100
+ "readonly": true
101
+ }, {
102
+ "name": i18n(`\u771f\u5b9e\u8def\u5f84`, `Real path`),
103
+ "type": "url",
104
+ "key": "realpath",
105
+ "comment": "",
106
+ "size": "300",
107
+ "unit": "bit",
108
+ "ratio": 0.125
109
+ }, {
110
+ "name": i18n(`\u52a8\u4f5c`, `action`),
111
+ "type": "select",
112
+ "key": "action",
113
+ "comment": "",
114
+ "options": [{
115
+ "name": "跳转",
116
+ "value": 0
117
+ }, {
118
+ "name": "转发",
119
+ "value": 1
120
+ }],
121
+ "size": "100",
122
+ "unit": "bit",
123
+ "ratio": 0.125
124
+ }, {
125
+ "name": i18n(`\u72b6\u6001`, `state`),
126
+ "type": "select",
127
+ "key": "status",
128
+ "comment": "",
129
+ "options": [{
130
+ "name": "启用",
131
+ "value": 0
132
+ }, {
133
+ "name": "禁用",
134
+ "value": 1
135
+ }],
136
+ "size": "100",
137
+ "unit": "bit",
138
+ "ratio": 0.125
139
+ }, {
140
+ "name": i18n(``, ``),
141
+ "type": "byte",
142
+ "key": "",
143
+ "comment": "",
144
+ "options": {
145
+ name: "访问",
146
+ do(o) {
147
+ var url = o.url;
148
+ if (!/^\//.test(url))
149
+ url = "/" + url;
150
+ window.open(url, null);
151
+ }
152
+ },
153
+ "size": 1,
154
+ "unit": "byte",
155
+ "ratio": 1,
156
+ "readonly": true
157
+ }];
158
+ assert(JSON.stringify(data, null, 4), JSON0.stringify(data, null, 4))
159
+ }
82
160
  function JSON_test() {
83
161
  window.JSON0 = JSON0;
84
162
  window.JSON = void 0;
85
163
  delete modules.JSON;
86
- modules.init("JSON", test);
164
+ modules.init("JSON", test2);
87
165
  window.JSON = JSON0;
88
166
  }
@@ -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 {...}
@@ -63,19 +63,17 @@ var trimStringLiteral = function (block) {
63
63
  }
64
64
  return block_string;
65
65
  };
66
- var paramsMap = Object.create(null);
66
+ var paramsMap = null;
67
67
  var module_string = '';
68
- function breakcode(data, args) {
69
- if (!args) return [data];
68
+ function breakcode(data, occurs) {
69
+ if (!occurs) return [data];
70
70
  module_string = data;
71
- Object.keys(args).forEach(function (key) {
72
- paramsMap[key] = true;
73
- });
71
+ paramsMap = Object.assign(Object.create(null), occurs);
74
72
  var code_blocks = scanner(module_string);
75
73
  module_string = code_blocks.map(trimStringLiteral).join("");
76
- var res = Object.keys(paramsMap).filter(k => !hasOwnProperty.call(args, k));
74
+ var res = Object.keys(paramsMap).filter(k => !hasOwnProperty.call(occurs, k));
77
75
  var val = res.map(k => paramsMap[k]);
78
- paramsMap = Object.create(null);
76
+ paramsMap = null;
79
77
  data = module_string;
80
78
  module_string = '';
81
79
  return [data, res, val];
@@ -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) {
@@ -798,7 +805,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, setsol
798
805
  i = killdec(body, i, _getdeepname, '', deepkill);
799
806
  }
800
807
  else {
801
- i = killspr(body, i, _getobjname, setsolid, deepkill);
808
+ i = killspr(body, i, _getobjname, deepkill);
802
809
  }
803
810
  continue;
804
811
  }
@@ -808,11 +815,11 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, setsol
808
815
  var p = o.prev;
809
816
  if (p.transive || /^(if|else|while|with|switch)$/.test(p.text)) deepkill(o);
810
817
  }
811
- else if (!o.prev || o.prev.type === STAMP || o.prev.type === STRAP) {
818
+ else if (!o.prev || o.prev.type & (STAMP | STRAP)) {
812
819
  deepkill(o);
813
820
  }
814
821
  else {
815
- i = killspr(body, i, _getobjname, setsolid, deepkill);
822
+ i = killspr(body, i, _getobjname, deepkill);
816
823
  continue;
817
824
  }
818
825
  }
@@ -971,8 +978,8 @@ var unforof = function (o, getnewname, used) {
971
978
  o.push(...mo);
972
979
  o.push({ type: STAMP, text: ',' });
973
980
  }
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()`));
981
+ if (useSimpleLoop) o.push(...scanner2(`${iname}=0,${gname}=${oname}["length"];${iname}<${gname}&&(${createString([p])}=${oname}[${iname}],true);${iname}++`));
982
+ 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"]()`));
976
983
  relink(o);
977
984
  };
978
985
  var unarrow = function (body, i, killobj, letname_) {
@@ -993,7 +1000,7 @@ var unarrow = function (body, i, killobj, letname_) {
993
1000
  if (n.type !== SCOPED || n.entry !== "{") {
994
1001
  var nni = skipAssignment(body, ni);
995
1002
  b = scanner2('{}')[0];
996
- b.push({ type: STRAP, text: "return" }, ...body.splice(ni, nni - ni, b));
1003
+ splice(b, 0, 0, { type: STRAP, transive: true, text: "return" }, ...splice(body, ni, nni - ni, b));
997
1004
  killarg(h, b, letname_);
998
1005
  killobj(b);
999
1006
  ni = nni;
@@ -1056,10 +1063,10 @@ var killarg = function (head, body, _getname, setarg = true) {
1056
1063
  argcodes.unshift.apply(argcodes, anames.map((a, i) => {
1057
1064
  if (a === cname) cname = '';
1058
1065
  var n = anames.length - i;
1059
- return `${a}=arguments.length>${collect + n - 1}?arguments[arguments.length - ${n}]:undefined`;
1066
+ return `${a}=arguments["length"]>${collect + n - 1}?arguments[arguments["length"] - ${n}]:undefined`;
1060
1067
  }));
1061
1068
 
1062
- if (cname) argcodes.unshift(`var ${cname}=Array.prototype.slice.call(arguments,${collect}${index > collect ? `,${collect - index}` : ""})`);
1069
+ if (cname) argcodes.unshift(`var ${cname}=slice_["call"](arguments,${collect}${index > collect ? `,${collect - index}` : ""})`), rootenvs.slice_ = true;
1063
1070
  }
1064
1071
  if (argcodes.length && setarg) {
1065
1072
  if (!body) {
@@ -1315,25 +1322,6 @@ var down = function (scoped) {
1315
1322
  scoped.body.unshift.apply(scoped.body, codelist);
1316
1323
  };
1317
1324
 
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
1325
  var markcodes = [];
1338
1326
  if (scoped.isfunc && scoped.used.this && (funcMark || scoped.insett)) {
1339
1327
  let tn = _getname("this_");
@@ -1349,9 +1337,9 @@ var down = function (scoped) {
1349
1337
  }
1350
1338
  var fordeep = 0;
1351
1339
  var _killobj = function (_getlocal, o) {
1352
- return killobj(o, gettmpname, getletname, _getlocal, _letname, setsolid);
1340
+ return killobj(o, gettmpname, getletname, _getlocal, _letname);
1353
1341
  };
1354
- var kill = function (scoped, _, body) {
1342
+ var kill = function (scoped, _, parentScope) {
1355
1343
  if (scoped.isfunc) return down(scoped);
1356
1344
  killlet(scoped);
1357
1345
  var saveddeep = fordeep;
@@ -1380,6 +1368,7 @@ var down = function (scoped) {
1380
1368
  fordeep = saveddeep;
1381
1369
  };
1382
1370
  if (scoped.isfunc) {
1371
+ if (!scoped.body && scoped.head) scoped.body = scoped.head.next;
1383
1372
  if (scoped.head) var [argsmap, argcodes] = killarg(scoped.head, scoped.body, _letname, false);
1384
1373
  else argcodes = [];
1385
1374
  if ((markcodes.length || argcodes.length) && !funcMark) precode(markcodes.concat(argcodes).join(";") + ";");
@@ -1412,6 +1401,7 @@ var down = function (scoped) {
1412
1401
  scoped.yield = false;
1413
1402
  }
1414
1403
  var vars1 = Object.keys(vars).filter(k => !(k in scoped.vars));
1404
+ scoped.vars = vars;
1415
1405
  if (argsmap) vars1 = vars1.filter(k => !(k in argsmap));
1416
1406
  if (vars1.length && scoped.body) scoped.body.push(...scanner2(`\r\nvar ${vars1}`));
1417
1407
  if (scoped.body) relink(scoped.body);
@@ -1433,6 +1423,10 @@ var downcode = downLevel.code = function (code) {
1433
1423
  rootHyper = rootenvs.Symbol || code.yield || code.async;
1434
1424
  down(code.scoped);
1435
1425
  code.keepcolor = false;
1426
+ if (rootenvs.slice_) {
1427
+ delete rootenvs.slice_;
1428
+ if (!code.vars.slice_) splice(code.scoped.body, 0, 0, ...scanner2('var slice_ = Array["prototype"]["slice"];\r\n'));
1429
+ }
1436
1430
  rootenvs = null;
1437
1431
  return code;
1438
1432
  };