efront 4.32.3 → 4.33.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.
@@ -2282,7 +2282,7 @@
2282
2282
  en: "You may open the port opened to view the demo: $1"
2283
2283
 
2284
2284
  - zh-CN: 请在空目录或efront目录执行创建操作!
2285
- en: Please perform the creation operation in an empty or front directory!
2285
+ en: Please perform the creation operation in an empty or efront directory!
2286
2286
 
2287
2287
  - zh-CN: 当前文件夹不为空!
2288
2288
  en: The current folder is not empty!
@@ -2399,7 +2399,7 @@
2399
2399
  en: Connect to an efront server and obtain the Dash
2400
2400
 
2401
2401
  - zh-CN: 用一个连接号登录本机的efront服务器,接收并打印消息
2402
- en: Log in to the front server of the local machine with a Dash to receive and print messages
2402
+ en: Log in to the efront server of the local machine with a Dash to receive and print messages
2403
2403
 
2404
2404
  - zh-CN: 向一个连接号发送消息
2405
2405
  en: Send a message to a Dash
@@ -2408,7 +2408,7 @@
2408
2408
  en: Check for External variable in a file or folder
2409
2409
 
2410
2410
  - zh-CN: 执行按efront方式加载的代码
2411
- en: Executing code loaded in front mode
2411
+ en: Executing code loaded in efront mode
2412
2412
 
2413
2413
  - zh-CN: 查找含有指定的外部变量的文件
2414
2414
  en: Find the file containing the specified External variable
@@ -51,7 +51,7 @@ ACQ.MERCHANT_PERM_RECEIPT_DAY_LIMIT 超过单日累计收款额度 联系支付
51
51
  return a;
52
52
  }
53
53
  var amount = request.id;
54
- if (!/^(\d+)(\.\d+)?$/.test(amount)) amount = encode62.packdecode(request.id);
54
+ if (!/^(\d+)(\.\d+)?$/.test(amount)) amount = crypt$encode62.packdecode(request.id);
55
55
  var [amount, subject = '网页扫码支付'] = amount.split(',');
56
56
  var trade_no = createId();
57
57
  if (!+amount) return forbidden("参数异常");
@@ -0,0 +1,26 @@
1
+ var ASN1 = function (tag) { // tag=tagClass|type|composed_flag
2
+ var length = 0;
3
+ var bytesarr = [];
4
+ for (var cx = 1, dx = arguments.length; cx < dx; cx++) {
5
+ var bytes = arguments[cx];
6
+ if (bytes.constructor !== Array) {
7
+ bytes = Array.apply(null, bytes);
8
+ }
9
+ bytesarr.push(bytes);
10
+ length += bytes.length;
11
+ }
12
+ var asn1 = [tag];
13
+ if (length > 127) {
14
+ var nums = [];
15
+ while (length > 0) {
16
+ nums.unshift(length & 0xff);
17
+ length = length >>> 8;
18
+ }
19
+ asn1.push(0x80 | nums.length, ...nums);
20
+ }
21
+ else {
22
+ asn1.push(length);
23
+ }
24
+ asn1 = asn1.concat(...bytesarr);
25
+ return asn1;
26
+ };
@@ -0,0 +1,131 @@
1
+ exports = ASN1;
2
+ export const
3
+ UNIVERSAL = 0x00,
4
+ APPLICATION = 0x40,
5
+ CONTEXT_SPECIFIC = 0x80,
6
+ PRIVATE = 0xC0;
7
+ export const
8
+ NONE = 0,
9
+ BOOLEAN = 1,
10
+ INTEGER = 2,
11
+ BITSTRING = 3,
12
+ OCTETSTRING = 4,
13
+ NULL = 5,
14
+ OID = 6,
15
+ ODESC = 7,
16
+ EXTERNAL = 8,
17
+ REAL = 9,
18
+ ENUMERATED = 10,
19
+ EMBEDDED = 11,
20
+ UTF8 = 12,
21
+ ROID = 13,
22
+ SEQUENCE = 16,
23
+ SET = 17,
24
+ PRINTABLESTRING = 19,
25
+ IA5STRING = 22,
26
+ UTCTIME = 23,
27
+ GENERALIZEDTIME = 24,
28
+ BMPSTRING = 30;
29
+ export const CONSTRUCTED = 0x20;
30
+ export var Null = ASN1(NULL);
31
+ export var integer = function (value) {
32
+ if (value.length) return ASN1(INTEGER, value);
33
+ if (value == 0) return ASN1(INTEGER, [0]);
34
+ let bytes = [];
35
+ let isNegative = value < 0;
36
+ if (typeof value === 'bigint') {
37
+ if (isNegative) value = -value + 1n;
38
+ while (value > 0) {
39
+ bytes.push(Number(value & BigInt(0xff)));
40
+ value >>= BigInt(8);
41
+ }
42
+ }
43
+ else {
44
+ if (isNegative) value = -value + 1;
45
+ while (value > 0) {
46
+ bytes.push(value & 0xff);
47
+ value >>= 8;
48
+ }
49
+ }
50
+ if ((bytes[0] & 0x80) !== 0 && !isNegative) bytes.push(0x00); // 正数 MSB 0
51
+ if ((bytes[0] & 0x7f) === 0 && isNegative) bytes.push(0xff); // 负数 MSB 1
52
+ bytes.reverse();
53
+ return ASN1(INTEGER, bytes);
54
+ };
55
+ export var boolean, bool = boolean = function (v) {
56
+ return ASN1(BOOLEAN, [v ? 0xff : 0]);
57
+ };
58
+ export var True = bool(true);
59
+ export var False = bool(false);
60
+ export var bitString = function (bytes) {
61
+ return ASN1(BITSTRING, bytes);
62
+ };
63
+ export var octetString = ASN1.octet = function (bytes) {
64
+ return ASN1(OCTETSTRING, bytes);
65
+ };
66
+ export var oid = function () {
67
+ var [oid] = arguments;
68
+ if (typeof oid === 'string') oid = oid.split('.').map(a => +a);
69
+ if (typeof oid === 'number') oid = Array.prototype.slice.call(arguments, 0, arguments.length);
70
+ var first = 40 * oid[0] + oid[1];
71
+ oid = [first].concat(oid.slice(2));
72
+ var bytes = [OID];
73
+ for (var arc of oid) {
74
+ if (arc === 0) {
75
+ bytes.push([0]);
76
+ continue;
77
+ };
78
+ var bts = [];
79
+ while (arc > 0) {
80
+ bts.push(arc % 128);
81
+ arc = Math.floor(arc / 128);
82
+ }
83
+ bts.reverse();
84
+ for (let i = 0; i < bts.length - 1; i++) {
85
+ bts[i] |= 128;
86
+ }
87
+ bytes.push(bts);
88
+ }
89
+ return ASN1.apply(null, bytes);
90
+ };
91
+ export var utf8 = function (string) {
92
+ if (typeof string === 'string') string = encodeUTF8(string);
93
+ return ASN1(UTF8, string);
94
+ };
95
+ export var printable = function (string) {
96
+ if (typeof string === 'string') string = encodeUTF8(string);
97
+ return ASN1(PRINTABLESTRING, string);
98
+ };
99
+ var getTime = function (value) {
100
+ if (typeof value === "number" || /^\d+[\/\\\-]/i.test(value)) value = new Date(value);
101
+ if (value instanceof Date) {
102
+ var n = n => n < 10 ? '0' + n : n;
103
+ value = [
104
+ value.getUTCFullYear(),
105
+ value.getUTCMonth() + 1,
106
+ value.getUTCDate(),
107
+ value.getUTCHours(),
108
+ value.getUTCMinutes(),
109
+ value.getUTCSeconds()
110
+ ].map(n).join("") + "Z";
111
+ }
112
+ return value;
113
+ }
114
+ export var generaltime, time = generaltime = function (value) {
115
+ value = getTime(value);
116
+ return ASN1(GENERALIZEDTIME, encodeUTF8(value));
117
+ };
118
+ export var utctime = function (value) {
119
+ // yyMMddhhmmssZ
120
+ value = getTime(value).slice(-13);
121
+ return ASN1(UTCTIME, encodeUTF8(value));
122
+ }
123
+ export var set = function (...bytes) {
124
+ return ASN1(SET | CONSTRUCTED, ...bytes);
125
+ }
126
+ export var sequence = function (...bytes) {
127
+ return ASN1(SEQUENCE | CONSTRUCTED, ...bytes);
128
+ }
129
+ export var specific = function (...bytes) {
130
+ return ASN1(CONTEXT_SPECIFIC | CONSTRUCTED, ...bytes);
131
+ }
@@ -0,0 +1,86 @@
1
+ function checkRange(from, to) {
2
+ if (!isFinit(from) || !isFinit(to)) throw Error('边界异常!');
3
+ if (from > to) throw new Error(`左边界${from}大于右边界${to}!`);
4
+ }
5
+ function copyCaped(copyto, caped) {
6
+ copyto.length = caped.length;
7
+ for (var cx = 0, dx = copyto.length; cx < dx; cx++) {
8
+ copyto[cx] = caped[cx];
9
+ }
10
+ }
11
+ // 包含from不包含to,步进单位是1
12
+ function SliceRange(from, to) {
13
+ checkRange(from, to);
14
+ if (!this || this.constructor !== SliceRange) return new SliceRange(from, to);
15
+ if (from < to) {
16
+ this[0] = [from, to];
17
+ this.length = 1;
18
+ }
19
+ else {
20
+ this.length = 0;
21
+ }
22
+ }
23
+
24
+ SliceRange.prototype.delete = function (from, to) {
25
+ checkRange(from, to);
26
+ var caped = [];
27
+ for (var cx = 0, dx = this.length; cx < dx; cx++) {
28
+ var [m, n] = this[cx];
29
+ delete this[cx];
30
+ if (m >= from && n <= to) continue;
31
+ if (n < from || m > to) {
32
+ caped.push([m, n]);
33
+ continue;
34
+ }
35
+ if (m < from) {
36
+ caped.push([m, from]);
37
+ }
38
+ if (n > to) {
39
+ caped.push([to, n]);
40
+ }
41
+ }
42
+ copyCaped(this, caped);
43
+ };
44
+ SliceRange.prototype.split = function (maxSize) {
45
+ var caped = [];
46
+ for (var cx = 0, dx = this.length; cx < dx; cx++) {
47
+ var [m, n] = this[cx];
48
+ while (n - m > maxSize) {
49
+ caped.push([m, m += maxSize]);
50
+ }
51
+ if (n > m) caped.push([m, n]);
52
+ }
53
+ copyCaped(this, caped);
54
+ };
55
+ SliceRange.prototype.add = function (from, to) {
56
+ checkRange(from, to);
57
+ if (from === to) return;
58
+ var caped = [];
59
+ var pushed = false;
60
+ for (var cx = 0, dx = this.length; cx < dx; cx++) {
61
+ var [m, n] = this[cx];
62
+ delete this[cx];
63
+ if (n < from) {
64
+ caped.push([m, n]);
65
+ continue;
66
+ }
67
+ if (m > to) {
68
+ if (!pushed) {
69
+ caped.push([from, to]);
70
+ pushed = true;
71
+ }
72
+ caped.push([m, n]);
73
+ continue;
74
+ }
75
+ if (m >= from) {
76
+ m = from;
77
+ }
78
+ if (n <= to) {
79
+ n = to;
80
+ }
81
+ from = m, to = n;
82
+ }
83
+ if (!pushed) caped.push([from, to]);
84
+ copyCaped(this, caped);
85
+ }
86
+ SliceRange.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
@@ -0,0 +1,240 @@
1
+ var BigInt = this.BigInt;
2
+ function int(b) {
3
+ var Num = BigInt ? BigInt : Number;
4
+ var a = b;
5
+ var s = Num(0);
6
+ var isNeg = a[0] & 0x80;
7
+ if (isNeg) {
8
+ if (a[0] === 0xff) a = a.slice(1);
9
+ }
10
+ for (var cx = 0, dx = a.length; cx < dx; cx++) {
11
+ s = s * Num(256) + Num(a[cx]);
12
+ }
13
+ if (s > 0x1fffffffffffff && !BigInt) {
14
+ return b;
15
+ // throw new Error('数值精度超出限制!');
16
+ }
17
+ if (s < 0x1fffffffffffff && BigInt) s = Number(s);
18
+ if (isNeg) s = -s;
19
+ return s;
20
+ }
21
+
22
+ function oid(a) {
23
+ var d = [];
24
+ for (var cx = 0, dx = a.length; cx < dx;) {
25
+ var n = 0;
26
+ do {
27
+ var b = a[cx++];
28
+ n = n * 128 + (b & 0x7f);
29
+ } while (b & 0x80);
30
+ d.push(n);
31
+ }
32
+ var n = d[0];
33
+ d.splice(0, 1, n / 40 | 0, n % 40);
34
+ return d.join('.');
35
+ }
36
+
37
+ var typeNames = [
38
+ 'NONE',
39
+ 'BOOLEAN',
40
+ 'INTEGER',
41
+ 'BITSTRING',
42
+ 'OCTETSTRING',
43
+ 'NULL',
44
+ 'OID',
45
+ 'ODESC',
46
+ 'EXTERNAL',
47
+ 'REAL',
48
+ 'ENUMERATED',
49
+ 'EMBEDDED',
50
+ 'UTF8',
51
+ 'ROID',
52
+ '14',
53
+ '15',
54
+ 'SEQUENCE',
55
+ 'SET',
56
+ 'NUMERICSTRING',
57
+ 'PRINTABLESTRING',
58
+ 'TELETEXSTRING',
59
+ 'VIDEOTEXSTRING',
60
+ 'IASSTRING',
61
+ 'UTCTIME',
62
+ 'GENERALIZEDTIME',
63
+ 'GRAPHICSTRING',
64
+ 'VISIBLESTRING',
65
+ 'GENERALSTRING',
66
+ 'UNIVERSALSTRING',
67
+ 'CHARACTERSTRING',
68
+ 'BMPSTRING',
69
+ '31',
70
+ ];
71
+ var classNames = [
72
+ 'UNIVERSAL',
73
+ "APPLICATION",
74
+ "CONTEXT_SPECIFIC",
75
+ "PRIVATE"
76
+ ];
77
+ var typeMap = {
78
+ "octet": "octetString",
79
+ "bit": "bitString",
80
+ "generalizedtime": "time",
81
+ "boolean": 'bool',
82
+ };
83
+ var { SEQUENCE, SET, CONTEXT_SPECIFIC } = ASN_1;
84
+ var stringify = function (obj, deep = 1) {
85
+ var deep1 = deep + 1;
86
+ var space1 = Array(deep1).join(" ");
87
+ var space = Array(deep).join(" ");
88
+ if (obj instanceof Array) {
89
+ var a = [];
90
+ for (var o of obj) {
91
+ var d = stringify(o, deep1);
92
+ a.push(d);
93
+ }
94
+ return a.join(",\r\n" + space1);
95
+ }
96
+ if (!obj) return;
97
+ var a = obj.tagName.toLowerCase().split('|').map(a => a.trim());
98
+ var iscollect = obj.type === SEQUENCE || obj.type === SET || !obj.type && obj.class === CONTEXT_SPECIFIC;
99
+ var n = a.filter(a => a != "constructed").map(a => a.split("_").pop()).join("_");
100
+ if (iscollect && !obj.constructed) n += "_noconstruct";
101
+ if (!iscollect && obj.constructed) n += "_constructed";
102
+ if (n === 'null') return `Null`;
103
+ if (obj.children) {
104
+ if (obj.children.length) return `${n}(// ${deep}, ${obj.length}\r\n${space1}${stringify(obj.children, deep)}\r\n${space})`;
105
+ return `${n}()`;
106
+ }
107
+ var value = obj.value !== obj.data ? obj.value : `[${Array.prototype.slice.call(obj.data, 0, obj.data.length).join(', ')}]`;
108
+ var comment = '';
109
+ if (typeof value === 'bigint') value = value > 0x1fffffffffffff || value < -0x1fffffffffffff ? String(value) + "n" : value;
110
+ else if (obj.value !== obj.data) {
111
+ if (value in valueComment) comment = valueComment[value];
112
+ value = JSON.stringify(value);
113
+ }
114
+ if (!/_/.test(n)) n = n.replace(/string$/i, ''), n = typeMap[n] || n;
115
+ if (n in ASN_1) var res = `${n}(${value})`;
116
+ else res = `ASN1(${obj.tagName}, ${value})`;
117
+ if (comment) res = `/* ${comment} */\r\n${space}` + res;
118
+ return res;
119
+ }
120
+ var valueComment = {};
121
+ class Asn1Object {
122
+ toString(comment) {
123
+ var _comment = valueComment;
124
+ if (typeof comment === "object" && comment !== null) valueComment = comment;
125
+ var res = stringify(this, this.deep || 1);
126
+ valueComment = _comment;
127
+ return res;
128
+ }
129
+ }
130
+ function decodeASN1(buff, deep = 0) {
131
+ var parsed = [];
132
+ deep++;
133
+ for (var index = 0, cx = 0, dx = buff.length; cx < dx; index++) {
134
+ var bx = cx;
135
+ var tag = buff[cx++];
136
+ if (!tag) break;
137
+ var length = buff[cx++];
138
+ if (length >= 0x80) {
139
+ var length = 0x7f & length;
140
+ var num = 0;
141
+ while (length > 0) {
142
+ length--;
143
+ var b = buff[cx++];
144
+ num = (num << 8) + b;
145
+ }
146
+ length = num;
147
+ }
148
+ var data, value = data = buff.slice(cx, cx += length);
149
+ var bf = buff.slice(bx, cx);
150
+ var constructed = !!(0x20 & tag);
151
+ var Class = tag & 0xc0;
152
+ var className = classNames[Class >>> 6];
153
+ var type = tag & 0x1f;
154
+ var typeName = typeNames[type];
155
+ var hasChildren = false;
156
+ var showValue = false;
157
+ switch (type) {
158
+ case 0:// 保留给编码规则使用
159
+ hasChildren = constructed;
160
+ if (hasChildren) value = decodeASN1(value, deep);
161
+ break;
162
+ case 1:// 布尔类型
163
+ showValue = !constructed;
164
+ if (showValue) value = !!value[0];
165
+ break;
166
+ case 2:// 整型
167
+ showValue = !constructed;
168
+ if (showValue) value = int(value);
169
+ break;
170
+ case 5:// NULL
171
+ showValue = !constructed;
172
+ if (showValue) value = null;
173
+ break;
174
+ case 6:// oid
175
+ showValue = !constructed;
176
+ if (showValue) value = oid(value);
177
+ break;
178
+ case 12:// UTF8 字符串类型
179
+ showValue = !constructed;
180
+ if (showValue) value = decodeUTF8(value);
181
+ break;
182
+ case 16:// 序列和类型序列
183
+ value = decodeASN1(value, deep);
184
+ hasChildren = true;
185
+ break;
186
+ case 17:// 集合和类型的集合
187
+ value = decodeASN1(value, deep);
188
+ hasChildren = true;
189
+ break;
190
+ case 19: // 可打印字符串
191
+ showValue = !constructed;
192
+ if (showValue) value = decodeUTF8(value);
193
+ break;
194
+ case 23: // utc 时间 1950 - 2049
195
+ showValue = !constructed;
196
+ if (showValue) value = new Date(decodeUTF8(value).replace(/^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(Z|\+\d{4})$/, function (_, yy, MM, dd, hh, mm, ss, zone) {
197
+ yy = +yy;
198
+ if (yy < 50) yy += 100;
199
+ yy += 1900;
200
+ return `${yy}-${MM}-${dd}T${hh}:${mm}:${ss}${zone}`;
201
+ }));
202
+ break;
203
+ case 24: // utc 时间 4位年份
204
+ showValue = !constructed;
205
+ if (showValue) value = new Date(decodeUTF8(value).replace(
206
+ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}(?:\.\d+)?)(Z|\+\d{4})$/,
207
+ "$1-$2-$3T$4:$5:$6$7"
208
+ ));
209
+ break;
210
+ }
211
+
212
+ var obj = new Asn1Object(...{
213
+ tag,
214
+ tagName: [
215
+ Class ? className : '',
216
+ type ? typeName : '',
217
+ constructed ? 'CONSTRUCTED' : ''
218
+ ].filter(a => !!a).join(" | "),
219
+ type, typeName,
220
+ length,
221
+ constructed,
222
+ deep,
223
+ buff: bf,
224
+ index,
225
+ class: Class, className,
226
+ data, value
227
+ });
228
+ if (hasChildren) obj.children = value;
229
+ for (var k in obj) {
230
+ if (!/^(tag|index|deep|value|children|length)/.test(k) || k === "deep" && !hasChildren || k === "value" && !showValue) {
231
+ Object.defineProperty(obj, k, { value: obj[k], enumerable: false });
232
+ }
233
+ }
234
+ parsed.push(obj);
235
+ }
236
+ return parsed;
237
+ }
238
+ function main(data) {
239
+ return decodeASN1(data)[0];
240
+ }
@@ -0,0 +1,45 @@
1
+ import {
2
+ BOOLEAN,
3
+ bool,
4
+ INTEGER,
5
+ integer,
6
+ UTCTIME,
7
+ utctime,
8
+ UTF8,
9
+ utf8,
10
+ PRINTABLESTRING,
11
+ printable,
12
+ NULL,
13
+ Null,
14
+ OID,
15
+ oid,
16
+ GENERALIZEDTIME,
17
+ time
18
+ } from "./ASN_1";
19
+ // 将由decodeASN1生成的结构重新编码成二进制数据
20
+ function encodeASN1(object) {
21
+ var { type, data, class: class1, constructed, value } = object;
22
+ var tag = object.tag || type | class1 | constructed;
23
+ if (object.children) {
24
+ if (constructed === undefined) constructed = true;
25
+ data = object.children.map(encodeASN1);
26
+ return ASN1(tag, ...data);
27
+ }
28
+ else if (value !== undefined) {
29
+ switch (type) {
30
+ case BOOLEAN: data = bool(value); break;
31
+ case INTEGER: data = integer(value); break;
32
+ case OID: data = oid(value); break;
33
+ case UTCTIME: data = utctime(value); break;
34
+ case GENERALIZEDTIME: data = time(value); break;
35
+ case UTF8: data = utf8(value); break;
36
+ case NULL: data = Null; break;
37
+ case PRINTABLESTRING: data = printable(value); break;
38
+ default: data = ASN1(tag, data);
39
+ }
40
+ }
41
+ else {
42
+ data = ASN1(tag, data);
43
+ }
44
+ return data;
45
+ }
@@ -84,6 +84,8 @@ var parse干支 = function (a) {
84
84
  return (12 + g - z) % 12 / 2 * 10 + g + 1;
85
85
  };
86
86
  var compare = function (a, b) {
87
+ if (a.name) a = a.name;
88
+ if (b.name) b = b.name;
87
89
  for (var cx1 = a.length - 1, cx2 = b.length - 1; cx1 >= 0 && cx2 >= 0; cx1--, cx2--) {
88
90
  while (/[\s\u00a0]/.test(a[cx1])) cx1--;
89
91
  while (/[\s\u00a0]/.test(b[cx2])) cx2--;
@@ -45,8 +45,22 @@ function uncode(s) {
45
45
  return s.replace(/\\u(?:\{[0-9a-f]+\}|[0-9a-f]{4})/ig, esc);
46
46
  }
47
47
  function kicode(s) {
48
- return s.replace(/\\(?:u\{[0-9a-f]+\}|u[0-9a-f]{4}|x[0-9a-f]{2}|([0-7]{1,3}|[\s\S]))/ig, (a, b) => {
49
- if (!b) return esc(a);
48
+ var t = [];
49
+ return s.replace(/\\(?:u\{[0-9a-f]+\}|u[0-9a-f]{4}|x[0-9a-f]{2}|([0-7]{1,3}|[\s\S]))/ig, (a, b, i) => {
50
+ if (!b) {
51
+ if (/^\\x/.test(a)) {
52
+ b = parseInt(a.slice(2, 4), 16);
53
+ t.push(b);
54
+ i += a.length;
55
+ if (!/^\\x[0-9a-f]{2}$/i.test(s.slice(i, i + 4))) {
56
+ b = decodeUTF8(t);
57
+ t = [];
58
+ return b;
59
+ }
60
+ return "";
61
+ }
62
+ return esc(a);
63
+ }
50
64
  if (unescapeMap.hasOwnProperty(a)) return unescapeMap[a];
51
65
  if (/^[0-7]+$/.test(b)) return String.fromCharCode(parseInt(b, 8));
52
66
  return b;
@@ -0,0 +1 @@
1
+ Object.defineProperty;
@@ -82,7 +82,15 @@ var fixElement = function (o) {
82
82
  ps = ps.slice(cx);
83
83
  if (!ps.length);
84
84
  else if (ps.length === 1) {
85
- push(ps[0]);
85
+ if (ps[0].type === SCOPED) {
86
+ push(ps[0]);
87
+ }
88
+ else {
89
+ push(new Node({
90
+ type: QUOTED,
91
+ text: strings.encode(ps[0].text)
92
+ }));
93
+ }
86
94
  }
87
95
  else {
88
96
  ps.type = QUOTED;
@@ -206,7 +214,6 @@ Html.prototype.createScoped = function (code) {
206
214
  break;
207
215
  case QUOTED:
208
216
  case PIECE:
209
-
210
217
  if (c.length) {
211
218
  c.forEach(run);
212
219
  break;
@@ -227,10 +234,12 @@ Html.prototype.createScoped = function (code) {
227
234
  used[k].push(...s.used[k]);
228
235
  }
229
236
  }
237
+ for (var k in vars) delete used[k];
230
238
  }
231
239
  break;
232
240
  case EXPRESS:
233
241
  if (inScript || noTag) break;
242
+ if (c.queue.type === QUOTED) break;
234
243
  var t = c.text;
235
244
  t = parseExpress(t);
236
245
  var s = createScoped(t);