kn-es-features 1.0.2 → 1.0.3
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/dist/esfeatures.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
function _arrayLikeToArray(a, t) {
|
|
2
2
|
(t == null || t > a.length) && (t = a.length);
|
|
3
|
-
for (var e = 0,
|
|
4
|
-
|
|
5
|
-
return
|
|
3
|
+
for (var e = 0, i = Array(t); e < t; e++)
|
|
4
|
+
i[e] = a[e];
|
|
5
|
+
return i;
|
|
6
6
|
}
|
|
7
7
|
function _arrayWithHoles(a) {
|
|
8
8
|
if (Array.isArray(a))
|
|
@@ -22,24 +22,24 @@ function _assertThisInitialized(a) {
|
|
|
22
22
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
23
23
|
return a;
|
|
24
24
|
}
|
|
25
|
-
function asyncGeneratorStep(a, t, e,
|
|
25
|
+
function asyncGeneratorStep(a, t, e, i, n, r, s) {
|
|
26
26
|
try {
|
|
27
|
-
var u = a[r](s),
|
|
27
|
+
var u = a[r](s), o = u.value;
|
|
28
28
|
} catch (c) {
|
|
29
29
|
return void e(c);
|
|
30
30
|
}
|
|
31
|
-
u.done ? t(
|
|
31
|
+
u.done ? t(o) : Promise.resolve(o).then(i, n);
|
|
32
32
|
}
|
|
33
33
|
function _asyncToGenerator(a) {
|
|
34
34
|
return function() {
|
|
35
35
|
var t = this, e = arguments;
|
|
36
|
-
return new Promise(function(
|
|
36
|
+
return new Promise(function(i, n) {
|
|
37
37
|
var r = a.apply(t, e);
|
|
38
|
-
function s(
|
|
39
|
-
asyncGeneratorStep(r,
|
|
38
|
+
function s(o) {
|
|
39
|
+
asyncGeneratorStep(r, i, n, s, u, "next", o);
|
|
40
40
|
}
|
|
41
|
-
function u(
|
|
42
|
-
asyncGeneratorStep(r,
|
|
41
|
+
function u(o) {
|
|
42
|
+
asyncGeneratorStep(r, i, n, s, u, "throw", o);
|
|
43
43
|
}
|
|
44
44
|
s(void 0);
|
|
45
45
|
});
|
|
@@ -76,15 +76,15 @@ function _classPrivateMethodInitSpec(a, t) {
|
|
|
76
76
|
function _construct(a, t, e) {
|
|
77
77
|
if (_isNativeReflectConstruct())
|
|
78
78
|
return Reflect.construct.apply(null, arguments);
|
|
79
|
-
var
|
|
80
|
-
|
|
81
|
-
var n = new (a.bind.apply(a,
|
|
79
|
+
var i = [null];
|
|
80
|
+
i.push.apply(i, t);
|
|
81
|
+
var n = new (a.bind.apply(a, i))();
|
|
82
82
|
return e && _setPrototypeOf(n, e.prototype), n;
|
|
83
83
|
}
|
|
84
84
|
function _defineProperties(a, t) {
|
|
85
85
|
for (var e = 0; e < t.length; e++) {
|
|
86
|
-
var
|
|
87
|
-
|
|
86
|
+
var i = t[e];
|
|
87
|
+
i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(a, _toPropertyKey(i.key), i);
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
function _createClass(a, t, e) {
|
|
@@ -97,20 +97,20 @@ function _createForOfIteratorHelper(a, t) {
|
|
|
97
97
|
if (!e) {
|
|
98
98
|
if (Array.isArray(a) || (e = _unsupportedIterableToArray(a)) || t && a && typeof a.length == "number") {
|
|
99
99
|
e && (a = e);
|
|
100
|
-
var
|
|
100
|
+
var i = 0, n = function() {
|
|
101
101
|
};
|
|
102
102
|
return {
|
|
103
103
|
s: n,
|
|
104
104
|
n: function() {
|
|
105
|
-
return
|
|
105
|
+
return i >= a.length ? {
|
|
106
106
|
done: !0
|
|
107
107
|
} : {
|
|
108
108
|
done: !1,
|
|
109
|
-
value: a[
|
|
109
|
+
value: a[i++]
|
|
110
110
|
};
|
|
111
111
|
},
|
|
112
|
-
e: function(
|
|
113
|
-
throw
|
|
112
|
+
e: function(o) {
|
|
113
|
+
throw o;
|
|
114
114
|
},
|
|
115
115
|
f: n
|
|
116
116
|
};
|
|
@@ -124,11 +124,11 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
124
124
|
e = e.call(a);
|
|
125
125
|
},
|
|
126
126
|
n: function() {
|
|
127
|
-
var
|
|
128
|
-
return s =
|
|
127
|
+
var o = e.next();
|
|
128
|
+
return s = o.done, o;
|
|
129
129
|
},
|
|
130
|
-
e: function(
|
|
131
|
-
u = !0, r =
|
|
130
|
+
e: function(o) {
|
|
131
|
+
u = !0, r = o;
|
|
132
132
|
},
|
|
133
133
|
f: function() {
|
|
134
134
|
try {
|
|
@@ -150,9 +150,9 @@ function _defineProperty(a, t, e) {
|
|
|
150
150
|
}
|
|
151
151
|
function _get() {
|
|
152
152
|
return _get = typeof Reflect < "u" && Reflect.get ? Reflect.get.bind() : function(a, t, e) {
|
|
153
|
-
var
|
|
154
|
-
if (
|
|
155
|
-
var n = Object.getOwnPropertyDescriptor(
|
|
153
|
+
var i = _superPropBase(a, t);
|
|
154
|
+
if (i) {
|
|
155
|
+
var n = Object.getOwnPropertyDescriptor(i, t);
|
|
156
156
|
return n.get ? n.get.call(arguments.length < 3 ? a : e) : n.value;
|
|
157
157
|
}
|
|
158
158
|
}, _get.apply(null, arguments);
|
|
@@ -199,20 +199,20 @@ function _iterableToArray(a) {
|
|
|
199
199
|
function _iterableToArrayLimit(a, t) {
|
|
200
200
|
var e = a == null ? null : typeof Symbol < "u" && a[Symbol.iterator] || a["@@iterator"];
|
|
201
201
|
if (e != null) {
|
|
202
|
-
var
|
|
202
|
+
var i, n, r, s, u = [], o = !0, c = !1;
|
|
203
203
|
try {
|
|
204
204
|
if (r = (e = e.call(a)).next, t === 0) {
|
|
205
205
|
if (Object(e) !== e)
|
|
206
206
|
return;
|
|
207
|
-
|
|
207
|
+
o = !1;
|
|
208
208
|
} else
|
|
209
|
-
for (; !(
|
|
209
|
+
for (; !(o = (i = r.call(e)).done) && (u.push(i.value), u.length !== t); o = !0)
|
|
210
210
|
;
|
|
211
211
|
} catch (f) {
|
|
212
212
|
c = !0, n = f;
|
|
213
213
|
} finally {
|
|
214
214
|
try {
|
|
215
|
-
if (!
|
|
215
|
+
if (!o && e.return != null && (s = e.return(), Object(s) !== s))
|
|
216
216
|
return;
|
|
217
217
|
} finally {
|
|
218
218
|
if (c)
|
|
@@ -233,20 +233,20 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
233
233
|
function ownKeys(a, t) {
|
|
234
234
|
var e = Object.keys(a);
|
|
235
235
|
if (Object.getOwnPropertySymbols) {
|
|
236
|
-
var
|
|
237
|
-
t && (
|
|
236
|
+
var i = Object.getOwnPropertySymbols(a);
|
|
237
|
+
t && (i = i.filter(function(n) {
|
|
238
238
|
return Object.getOwnPropertyDescriptor(a, n).enumerable;
|
|
239
|
-
})), e.push.apply(e,
|
|
239
|
+
})), e.push.apply(e, i);
|
|
240
240
|
}
|
|
241
241
|
return e;
|
|
242
242
|
}
|
|
243
243
|
function _objectSpread2(a) {
|
|
244
244
|
for (var t = 1; t < arguments.length; t++) {
|
|
245
245
|
var e = arguments[t] != null ? arguments[t] : {};
|
|
246
|
-
t % 2 ? ownKeys(Object(e), !0).forEach(function(
|
|
247
|
-
_defineProperty(a,
|
|
248
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(a, Object.getOwnPropertyDescriptors(e)) : ownKeys(Object(e)).forEach(function(
|
|
249
|
-
Object.defineProperty(a,
|
|
246
|
+
t % 2 ? ownKeys(Object(e), !0).forEach(function(i) {
|
|
247
|
+
_defineProperty(a, i, e[i]);
|
|
248
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(a, Object.getOwnPropertyDescriptors(e)) : ownKeys(Object(e)).forEach(function(i) {
|
|
249
|
+
Object.defineProperty(a, i, Object.getOwnPropertyDescriptor(e, i));
|
|
250
250
|
});
|
|
251
251
|
}
|
|
252
252
|
return a;
|
|
@@ -260,10 +260,10 @@ function _possibleConstructorReturn(a, t) {
|
|
|
260
260
|
}
|
|
261
261
|
function _regenerator() {
|
|
262
262
|
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
|
|
263
|
-
var a, t, e = typeof Symbol == "function" ? Symbol : {},
|
|
264
|
-
function r(
|
|
265
|
-
var
|
|
266
|
-
return _regeneratorDefine(k, "_invoke", function(
|
|
263
|
+
var a, t, e = typeof Symbol == "function" ? Symbol : {}, i = e.iterator || "@@iterator", n = e.toStringTag || "@@toStringTag";
|
|
264
|
+
function r(y, p, S, M) {
|
|
265
|
+
var j = p && p.prototype instanceof u ? p : u, k = Object.create(j.prototype);
|
|
266
|
+
return _regeneratorDefine(k, "_invoke", function(F, N, T) {
|
|
267
267
|
var b, d, m, P = 0, I = T || [], A = !1, _ = {
|
|
268
268
|
p: 0,
|
|
269
269
|
n: 0,
|
|
@@ -299,7 +299,7 @@ function _regenerator() {
|
|
|
299
299
|
} else
|
|
300
300
|
d === 1 && (t = b.return) && t.call(b), d < 2 && (m = TypeError("The iterator does not provide a '" + w + "' method"), d = 1);
|
|
301
301
|
b = a;
|
|
302
|
-
} else if ((t = (A = _.n < 0) ? m :
|
|
302
|
+
} else if ((t = (A = _.n < 0) ? m : F.call(N, _)) !== s)
|
|
303
303
|
break;
|
|
304
304
|
} catch (g) {
|
|
305
305
|
b = a, d = 1, m = g;
|
|
@@ -312,57 +312,57 @@ function _regenerator() {
|
|
|
312
312
|
done: A
|
|
313
313
|
};
|
|
314
314
|
};
|
|
315
|
-
}(
|
|
315
|
+
}(y, S, M), !0), k;
|
|
316
316
|
}
|
|
317
317
|
var s = {};
|
|
318
318
|
function u() {
|
|
319
319
|
}
|
|
320
|
-
function
|
|
320
|
+
function o() {
|
|
321
321
|
}
|
|
322
322
|
function c() {
|
|
323
323
|
}
|
|
324
324
|
t = Object.getPrototypeOf;
|
|
325
|
-
var f = [][
|
|
325
|
+
var f = [][i] ? t(t([][i]())) : (_regeneratorDefine(t = {}, i, function() {
|
|
326
326
|
return this;
|
|
327
327
|
}), t), l = c.prototype = u.prototype = Object.create(f);
|
|
328
|
-
function y
|
|
329
|
-
return Object.setPrototypeOf ? Object.setPrototypeOf(
|
|
328
|
+
function h(y) {
|
|
329
|
+
return Object.setPrototypeOf ? Object.setPrototypeOf(y, c) : (y.__proto__ = c, _regeneratorDefine(y, n, "GeneratorFunction")), y.prototype = Object.create(l), y;
|
|
330
330
|
}
|
|
331
|
-
return
|
|
331
|
+
return o.prototype = c, _regeneratorDefine(l, "constructor", c), _regeneratorDefine(c, "constructor", o), o.displayName = "GeneratorFunction", _regeneratorDefine(c, n, "GeneratorFunction"), _regeneratorDefine(l), _regeneratorDefine(l, n, "Generator"), _regeneratorDefine(l, i, function() {
|
|
332
332
|
return this;
|
|
333
333
|
}), _regeneratorDefine(l, "toString", function() {
|
|
334
334
|
return "[object Generator]";
|
|
335
335
|
}), (_regenerator = function() {
|
|
336
336
|
return {
|
|
337
337
|
w: r,
|
|
338
|
-
m:
|
|
338
|
+
m: h
|
|
339
339
|
};
|
|
340
340
|
})();
|
|
341
341
|
}
|
|
342
|
-
function _regeneratorDefine(a, t, e,
|
|
342
|
+
function _regeneratorDefine(a, t, e, i) {
|
|
343
343
|
var n = Object.defineProperty;
|
|
344
344
|
try {
|
|
345
345
|
n({}, "", {});
|
|
346
346
|
} catch {
|
|
347
347
|
n = 0;
|
|
348
348
|
}
|
|
349
|
-
_regeneratorDefine = function(r, s, u,
|
|
349
|
+
_regeneratorDefine = function(r, s, u, o) {
|
|
350
350
|
function c(f, l) {
|
|
351
|
-
_regeneratorDefine(r, f, function(
|
|
352
|
-
return this._invoke(f, l,
|
|
351
|
+
_regeneratorDefine(r, f, function(h) {
|
|
352
|
+
return this._invoke(f, l, h);
|
|
353
353
|
});
|
|
354
354
|
}
|
|
355
355
|
s ? n ? n(r, s, {
|
|
356
356
|
value: u,
|
|
357
|
-
enumerable: !
|
|
358
|
-
configurable: !
|
|
359
|
-
writable: !
|
|
357
|
+
enumerable: !o,
|
|
358
|
+
configurable: !o,
|
|
359
|
+
writable: !o
|
|
360
360
|
}) : r[s] = u : (c("next", 0), c("throw", 1), c("return", 2));
|
|
361
|
-
}, _regeneratorDefine(a, t, e,
|
|
361
|
+
}, _regeneratorDefine(a, t, e, i);
|
|
362
362
|
}
|
|
363
363
|
function _setPrototypeOf(a, t) {
|
|
364
|
-
return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(e,
|
|
365
|
-
return e.__proto__ =
|
|
364
|
+
return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(e, i) {
|
|
365
|
+
return e.__proto__ = i, e;
|
|
366
366
|
}, _setPrototypeOf(a, t);
|
|
367
367
|
}
|
|
368
368
|
function _slicedToArray(a, t) {
|
|
@@ -373,9 +373,9 @@ function _superPropBase(a, t) {
|
|
|
373
373
|
;
|
|
374
374
|
return a;
|
|
375
375
|
}
|
|
376
|
-
function _superPropGet(a, t, e,
|
|
377
|
-
var n = _get(_getPrototypeOf(1 &
|
|
378
|
-
return 2 &
|
|
376
|
+
function _superPropGet(a, t, e, i) {
|
|
377
|
+
var n = _get(_getPrototypeOf(1 & i ? a.prototype : a), t, e);
|
|
378
|
+
return 2 & i && typeof n == "function" ? function(r) {
|
|
379
379
|
return n.apply(e, r);
|
|
380
380
|
} : n;
|
|
381
381
|
}
|
|
@@ -387,9 +387,9 @@ function _toPrimitive(a, t) {
|
|
|
387
387
|
return a;
|
|
388
388
|
var e = a[Symbol.toPrimitive];
|
|
389
389
|
if (e !== void 0) {
|
|
390
|
-
var
|
|
391
|
-
if (typeof
|
|
392
|
-
return
|
|
390
|
+
var i = e.call(a, t || "default");
|
|
391
|
+
if (typeof i != "object")
|
|
392
|
+
return i;
|
|
393
393
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
394
394
|
}
|
|
395
395
|
return (t === "string" ? String : Number)(a);
|
|
@@ -414,6 +414,71 @@ function _unsupportedIterableToArray(a, t) {
|
|
|
414
414
|
return e === "Object" && a.constructor && (e = a.constructor.name), e === "Map" || e === "Set" ? Array.from(a) : e === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e) ? _arrayLikeToArray(a, t) : void 0;
|
|
415
415
|
}
|
|
416
416
|
}
|
|
417
|
+
function _usingCtx() {
|
|
418
|
+
var a = typeof SuppressedError == "function" ? SuppressedError : function(n, r) {
|
|
419
|
+
var s = Error();
|
|
420
|
+
return s.name = "SuppressedError", s.error = n, s.suppressed = r, s;
|
|
421
|
+
}, t = {}, e = [];
|
|
422
|
+
function i(n, r) {
|
|
423
|
+
if (r != null) {
|
|
424
|
+
if (Object(r) !== r)
|
|
425
|
+
throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");
|
|
426
|
+
if (n)
|
|
427
|
+
var s = r[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")];
|
|
428
|
+
if (s === void 0 && (s = r[Symbol.dispose || Symbol.for("Symbol.dispose")], n))
|
|
429
|
+
var u = s;
|
|
430
|
+
if (typeof s != "function")
|
|
431
|
+
throw new TypeError("Object is not disposable.");
|
|
432
|
+
u && (s = function() {
|
|
433
|
+
try {
|
|
434
|
+
u.call(r);
|
|
435
|
+
} catch (o) {
|
|
436
|
+
return Promise.reject(o);
|
|
437
|
+
}
|
|
438
|
+
}), e.push({
|
|
439
|
+
v: r,
|
|
440
|
+
d: s,
|
|
441
|
+
a: n
|
|
442
|
+
});
|
|
443
|
+
} else
|
|
444
|
+
n && e.push({
|
|
445
|
+
d: r,
|
|
446
|
+
a: n
|
|
447
|
+
});
|
|
448
|
+
return r;
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
e: t,
|
|
452
|
+
u: i.bind(null, !1),
|
|
453
|
+
a: i.bind(null, !0),
|
|
454
|
+
d: function() {
|
|
455
|
+
var n, r = this.e, s = 0;
|
|
456
|
+
function u() {
|
|
457
|
+
for (; n = e.pop(); )
|
|
458
|
+
try {
|
|
459
|
+
if (!n.a && s === 1)
|
|
460
|
+
return s = 0, e.push(n), Promise.resolve().then(u);
|
|
461
|
+
if (n.d) {
|
|
462
|
+
var c = n.d.call(n.v);
|
|
463
|
+
if (n.a)
|
|
464
|
+
return s |= 2, Promise.resolve(c).then(u, o);
|
|
465
|
+
} else
|
|
466
|
+
s |= 1;
|
|
467
|
+
} catch (f) {
|
|
468
|
+
return o(f);
|
|
469
|
+
}
|
|
470
|
+
if (s === 1)
|
|
471
|
+
return r !== t ? Promise.reject(r) : Promise.resolve();
|
|
472
|
+
if (r !== t)
|
|
473
|
+
throw r;
|
|
474
|
+
}
|
|
475
|
+
function o(c) {
|
|
476
|
+
return r = r !== t ? new a(c, r) : c, u();
|
|
477
|
+
}
|
|
478
|
+
return u();
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
}
|
|
417
482
|
function _wrapNativeSuper(a) {
|
|
418
483
|
var t = typeof Map == "function" ? /* @__PURE__ */ new Map() : void 0;
|
|
419
484
|
return _wrapNativeSuper = function(e) {
|
|
@@ -424,19 +489,19 @@ function _wrapNativeSuper(a) {
|
|
|
424
489
|
if (t !== void 0) {
|
|
425
490
|
if (t.has(e))
|
|
426
491
|
return t.get(e);
|
|
427
|
-
t.set(e,
|
|
492
|
+
t.set(e, i);
|
|
428
493
|
}
|
|
429
|
-
function
|
|
494
|
+
function i() {
|
|
430
495
|
return _construct(e, arguments, _getPrototypeOf(this).constructor);
|
|
431
496
|
}
|
|
432
|
-
return
|
|
497
|
+
return i.prototype = Object.create(e.prototype, {
|
|
433
498
|
constructor: {
|
|
434
|
-
value:
|
|
499
|
+
value: i,
|
|
435
500
|
enumerable: !1,
|
|
436
501
|
writable: !0,
|
|
437
502
|
configurable: !0
|
|
438
503
|
}
|
|
439
|
-
}), _setPrototypeOf(
|
|
504
|
+
}), _setPrototypeOf(i, e);
|
|
440
505
|
}, _wrapNativeSuper(a);
|
|
441
506
|
}
|
|
442
507
|
function _wrapRegExp() {
|
|
@@ -448,16 +513,16 @@ function _wrapRegExp() {
|
|
|
448
513
|
var u = RegExp(n, r);
|
|
449
514
|
return t.set(u, s || t.get(n)), _setPrototypeOf(u, e.prototype);
|
|
450
515
|
}
|
|
451
|
-
function
|
|
516
|
+
function i(n, r) {
|
|
452
517
|
var s = t.get(r);
|
|
453
|
-
return Object.keys(s).reduce(function(u,
|
|
454
|
-
var c = s[
|
|
518
|
+
return Object.keys(s).reduce(function(u, o) {
|
|
519
|
+
var c = s[o];
|
|
455
520
|
if (typeof c == "number")
|
|
456
|
-
u[
|
|
521
|
+
u[o] = n[c];
|
|
457
522
|
else {
|
|
458
523
|
for (var f = 0; n[c[f]] === void 0 && f + 1 < c.length; )
|
|
459
524
|
f++;
|
|
460
|
-
u[
|
|
525
|
+
u[o] = n[c[f]];
|
|
461
526
|
}
|
|
462
527
|
return u;
|
|
463
528
|
}, /* @__PURE__ */ Object.create(null));
|
|
@@ -465,17 +530,17 @@ function _wrapRegExp() {
|
|
|
465
530
|
return _inherits(e, RegExp), e.prototype.exec = function(n) {
|
|
466
531
|
var r = a.exec.call(this, n);
|
|
467
532
|
if (r) {
|
|
468
|
-
r.groups =
|
|
533
|
+
r.groups = i(r, this);
|
|
469
534
|
var s = r.indices;
|
|
470
|
-
s && (s.groups =
|
|
535
|
+
s && (s.groups = i(s, this));
|
|
471
536
|
}
|
|
472
537
|
return r;
|
|
473
538
|
}, e.prototype[Symbol.replace] = function(n, r) {
|
|
474
539
|
if (typeof r == "string") {
|
|
475
540
|
var s = t.get(this);
|
|
476
|
-
return a[Symbol.replace].call(this, n, r.replace(/\$<([^>]+)(>|$)/g, function(
|
|
541
|
+
return a[Symbol.replace].call(this, n, r.replace(/\$<([^>]+)(>|$)/g, function(o, c, f) {
|
|
477
542
|
if (f === "")
|
|
478
|
-
return
|
|
543
|
+
return o;
|
|
479
544
|
var l = s[c];
|
|
480
545
|
return Array.isArray(l) ? "$" + l.join("$") : typeof l == "number" ? "$" + l : "";
|
|
481
546
|
}));
|
|
@@ -483,8 +548,8 @@ function _wrapRegExp() {
|
|
|
483
548
|
if (typeof r == "function") {
|
|
484
549
|
var u = this;
|
|
485
550
|
return a[Symbol.replace].call(this, n, function() {
|
|
486
|
-
var
|
|
487
|
-
return typeof
|
|
551
|
+
var o = arguments;
|
|
552
|
+
return typeof o[o.length - 1] != "object" && (o = [].slice.call(o)).push(i(o, u)), r.apply(this, o);
|
|
488
553
|
});
|
|
489
554
|
}
|
|
490
555
|
return a[Symbol.replace].call(this, n, r);
|
|
@@ -502,12 +567,12 @@ function createSuite(a) {
|
|
|
502
567
|
case: r,
|
|
503
568
|
status: "pass"
|
|
504
569
|
});
|
|
505
|
-
}).catch(function(
|
|
570
|
+
}).catch(function(o) {
|
|
506
571
|
t.push({
|
|
507
572
|
suite: a,
|
|
508
573
|
case: r,
|
|
509
574
|
status: "fail",
|
|
510
|
-
error:
|
|
575
|
+
error: o.message
|
|
511
576
|
});
|
|
512
577
|
});
|
|
513
578
|
t.push({
|
|
@@ -515,16 +580,16 @@ function createSuite(a) {
|
|
|
515
580
|
case: r,
|
|
516
581
|
status: "pass"
|
|
517
582
|
});
|
|
518
|
-
} catch (
|
|
583
|
+
} catch (o) {
|
|
519
584
|
t.push({
|
|
520
585
|
suite: a,
|
|
521
586
|
case: r,
|
|
522
587
|
status: "fail",
|
|
523
|
-
error:
|
|
588
|
+
error: o.message
|
|
524
589
|
});
|
|
525
590
|
}
|
|
526
591
|
}
|
|
527
|
-
function
|
|
592
|
+
function i(r, s) {
|
|
528
593
|
if (!r)
|
|
529
594
|
throw new Error(s || "断言失败");
|
|
530
595
|
}
|
|
@@ -533,19 +598,19 @@ function createSuite(a) {
|
|
|
533
598
|
}
|
|
534
599
|
return {
|
|
535
600
|
test: e,
|
|
536
|
-
assert:
|
|
601
|
+
assert: i,
|
|
537
602
|
getResults: n
|
|
538
603
|
};
|
|
539
604
|
}
|
|
540
605
|
function printResults(a) {
|
|
541
606
|
var t = 0, e = 0;
|
|
542
|
-
a.forEach(function(
|
|
543
|
-
|
|
607
|
+
a.forEach(function(i) {
|
|
608
|
+
i.status === "pass" ? (t++, console.log(" ✓ [".concat(i.suite, "] ").concat(i.case))) : (e++, console.error(" ✗ [".concat(i.suite, "] ").concat(i.case, " — ").concat(i.error)));
|
|
544
609
|
}), console.log(`
|
|
545
610
|
共 `.concat(a.length, " 项,通过 ").concat(t, ",失败 ").concat(e));
|
|
546
611
|
}
|
|
547
612
|
function testLetConst() {
|
|
548
|
-
var a = createSuite("let & const"), t = a.test, e = a.assert,
|
|
613
|
+
var a = createSuite("let & const"), t = a.test, e = a.assert, i = a.getResults;
|
|
549
614
|
return t("let 块级作用域", function() {
|
|
550
615
|
for (var n = [], r = 0; r < 3; r++)
|
|
551
616
|
n.push(r);
|
|
@@ -553,36 +618,36 @@ function testLetConst() {
|
|
|
553
618
|
}), t("const 声明常量", function() {
|
|
554
619
|
var n = 3.14159;
|
|
555
620
|
e(n === 3.14159, "const 值应保持不变");
|
|
556
|
-
}),
|
|
621
|
+
}), i();
|
|
557
622
|
}
|
|
558
623
|
function testArrowFunctions() {
|
|
559
|
-
var a = createSuite("箭头函数"), t = a.test, e = a.assert,
|
|
624
|
+
var a = createSuite("箭头函数"), t = a.test, e = a.assert, i = a.getResults;
|
|
560
625
|
return t("基本语法", function() {
|
|
561
626
|
var n = function(s, u) {
|
|
562
627
|
return s + u;
|
|
563
628
|
};
|
|
564
629
|
e(n(2, 3) === 5, "箭头函数返回值应为 5");
|
|
565
|
-
}),
|
|
630
|
+
}), i();
|
|
566
631
|
}
|
|
567
632
|
function testTemplateLiterals() {
|
|
568
|
-
var a = createSuite("模板字符串"), t = a.test, e = a.assert,
|
|
633
|
+
var a = createSuite("模板字符串"), t = a.test, e = a.assert, i = a.getResults;
|
|
569
634
|
return t("基本插值", function() {
|
|
570
635
|
var n = "ES2015", r = "Hello, ".concat(n, "!");
|
|
571
636
|
e(r === "Hello, ES2015!", "模板字符串插值应正确");
|
|
572
|
-
}),
|
|
637
|
+
}), i();
|
|
573
638
|
}
|
|
574
639
|
function testDestructuring() {
|
|
575
|
-
var a = createSuite("解构赋值"), t = a.test, e = a.assert,
|
|
640
|
+
var a = createSuite("解构赋值"), t = a.test, e = a.assert, i = a.getResults;
|
|
576
641
|
return t("数组解构 - 基本", function() {
|
|
577
642
|
var n = 3;
|
|
578
643
|
e(n === 3, "数组解构基本用法");
|
|
579
644
|
}), t("数组解构 - 跳过元素", function() {
|
|
580
645
|
var n = [1, 2, 3, 4], r = n[3];
|
|
581
646
|
e(r === 4, "数组解构可跳过元素");
|
|
582
|
-
}),
|
|
647
|
+
}), i();
|
|
583
648
|
}
|
|
584
649
|
function testDefaultRestSpread() {
|
|
585
|
-
var a = createSuite("默认参数/Rest/Spread"), t = a.test, e = a.assert,
|
|
650
|
+
var a = createSuite("默认参数/Rest/Spread"), t = a.test, e = a.assert, i = a.getResults;
|
|
586
651
|
return t("spread 对象覆盖属性", function() {
|
|
587
652
|
var n = {
|
|
588
653
|
a: 1,
|
|
@@ -591,10 +656,10 @@ function testDefaultRestSpread() {
|
|
|
591
656
|
b: 99
|
|
592
657
|
});
|
|
593
658
|
e(r.b === 99, "spread 后面属性覆盖前面");
|
|
594
|
-
}),
|
|
659
|
+
}), i();
|
|
595
660
|
}
|
|
596
661
|
function testClasses() {
|
|
597
|
-
var a = createSuite("类(Class)"), t = a.test, e = a.assert,
|
|
662
|
+
var a = createSuite("类(Class)"), t = a.test, e = a.assert, i = a.getResults;
|
|
598
663
|
return t("基本类定义", function() {
|
|
599
664
|
var n = /* @__PURE__ */ function() {
|
|
600
665
|
function s(u) {
|
|
@@ -610,8 +675,8 @@ function testClasses() {
|
|
|
610
675
|
e(r.name === "Cat", "构造函数应正确赋值"), e(r.speak() === "Cat makes a sound.", "实例方法应正常工作");
|
|
611
676
|
}), t("类继承", function() {
|
|
612
677
|
var n = /* @__PURE__ */ function() {
|
|
613
|
-
function u(
|
|
614
|
-
_classCallCheck(this, u), this.name =
|
|
678
|
+
function u(o) {
|
|
679
|
+
_classCallCheck(this, u), this.name = o;
|
|
615
680
|
}
|
|
616
681
|
return _createClass(u, [{
|
|
617
682
|
key: "speak",
|
|
@@ -620,10 +685,10 @@ function testClasses() {
|
|
|
620
685
|
}
|
|
621
686
|
}]);
|
|
622
687
|
}(), r = /* @__PURE__ */ function(u) {
|
|
623
|
-
function
|
|
624
|
-
return _classCallCheck(this,
|
|
688
|
+
function o() {
|
|
689
|
+
return _classCallCheck(this, o), _callSuper(this, o, arguments);
|
|
625
690
|
}
|
|
626
|
-
return _inherits(
|
|
691
|
+
return _inherits(o, u), _createClass(o, [{
|
|
627
692
|
key: "speak",
|
|
628
693
|
value: function() {
|
|
629
694
|
return "".concat(this.name, ": Woof!");
|
|
@@ -648,11 +713,11 @@ function testClasses() {
|
|
|
648
713
|
}
|
|
649
714
|
}]);
|
|
650
715
|
}(), r = /* @__PURE__ */ function(u) {
|
|
651
|
-
function
|
|
716
|
+
function o(c) {
|
|
652
717
|
var f;
|
|
653
|
-
return _classCallCheck(this,
|
|
718
|
+
return _classCallCheck(this, o), f = _callSuper(this, o), f.r = c, f;
|
|
654
719
|
}
|
|
655
|
-
return _inherits(
|
|
720
|
+
return _inherits(o, u), _createClass(o, [{
|
|
656
721
|
key: "area",
|
|
657
722
|
value: function() {
|
|
658
723
|
return Math.PI * this.r * this.r;
|
|
@@ -660,7 +725,7 @@ function testClasses() {
|
|
|
660
725
|
}, {
|
|
661
726
|
key: "describe",
|
|
662
727
|
value: function() {
|
|
663
|
-
return _superPropGet(
|
|
728
|
+
return _superPropGet(o, "describe", this, 3)([]) + " (圆形)";
|
|
664
729
|
}
|
|
665
730
|
}]);
|
|
666
731
|
}(n), s = new r(1);
|
|
@@ -672,8 +737,8 @@ function testClasses() {
|
|
|
672
737
|
}
|
|
673
738
|
return _createClass(r, null, [{
|
|
674
739
|
key: "add",
|
|
675
|
-
value: function(u,
|
|
676
|
-
return u +
|
|
740
|
+
value: function(u, o) {
|
|
741
|
+
return u + o;
|
|
677
742
|
}
|
|
678
743
|
}]);
|
|
679
744
|
}();
|
|
@@ -688,8 +753,8 @@ function testClasses() {
|
|
|
688
753
|
get: function() {
|
|
689
754
|
return this._celsius * 9 / 5 + 32;
|
|
690
755
|
},
|
|
691
|
-
set: function(
|
|
692
|
-
this._celsius = (
|
|
756
|
+
set: function(o) {
|
|
757
|
+
this._celsius = (o - 32) * 5 / 9;
|
|
693
758
|
}
|
|
694
759
|
}]);
|
|
695
760
|
}(), r = new n(0);
|
|
@@ -715,8 +780,8 @@ function testClasses() {
|
|
|
715
780
|
s.increment(), s.increment(), e(s.value === 2, "私有字段应正确工作"), e(!("count" in s), "私有字段不可从外部访问");
|
|
716
781
|
}), t("类表达式", function() {
|
|
717
782
|
var n = /* @__PURE__ */ function() {
|
|
718
|
-
function s(u,
|
|
719
|
-
_classCallCheck(this, s), this.w = u, this.h =
|
|
783
|
+
function s(u, o) {
|
|
784
|
+
_classCallCheck(this, s), this.w = u, this.h = o;
|
|
720
785
|
}
|
|
721
786
|
return _createClass(s, [{
|
|
722
787
|
key: "area",
|
|
@@ -732,29 +797,29 @@ function testClasses() {
|
|
|
732
797
|
} catch {
|
|
733
798
|
e(!0, "类不提升,使用前必须先声明");
|
|
734
799
|
}
|
|
735
|
-
}),
|
|
800
|
+
}), i();
|
|
736
801
|
}
|
|
737
802
|
function testPromises() {
|
|
738
803
|
return _testPromises.apply(this, arguments);
|
|
739
804
|
}
|
|
740
805
|
function _testPromises() {
|
|
741
806
|
return _testPromises = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function a() {
|
|
742
|
-
var t, e,
|
|
807
|
+
var t, e, i, n, r;
|
|
743
808
|
return _regenerator().w(function(s) {
|
|
744
809
|
for (; ; )
|
|
745
810
|
switch (s.n) {
|
|
746
811
|
case 0:
|
|
747
|
-
return t = createSuite("Promise"), e = t.test,
|
|
812
|
+
return t = createSuite("Promise"), e = t.test, i = t.assert, n = t.getResults, r = [], r.push(e("基本 Promise resolve", function() {
|
|
748
813
|
return new Promise(function(u) {
|
|
749
814
|
return u(42);
|
|
750
815
|
}).then(function(u) {
|
|
751
|
-
return
|
|
816
|
+
return i(u === 42, "resolve 值应为 42");
|
|
752
817
|
});
|
|
753
818
|
})), r.push(e("基本 Promise reject", function() {
|
|
754
|
-
return new Promise(function(u,
|
|
755
|
-
return
|
|
819
|
+
return new Promise(function(u, o) {
|
|
820
|
+
return o(new Error("失败"));
|
|
756
821
|
}).catch(function(u) {
|
|
757
|
-
return
|
|
822
|
+
return i(u.message === "失败", "reject 应携带错误信息");
|
|
758
823
|
});
|
|
759
824
|
})), r.push(e("Promise 链式调用", function() {
|
|
760
825
|
return Promise.resolve(1).then(function(u) {
|
|
@@ -762,41 +827,41 @@ function _testPromises() {
|
|
|
762
827
|
}).then(function(u) {
|
|
763
828
|
return u * 3;
|
|
764
829
|
}).then(function(u) {
|
|
765
|
-
return
|
|
830
|
+
return i(u === 6, "链式调用结果应为 6");
|
|
766
831
|
});
|
|
767
832
|
})), r.push(e("Promise.all - 全部成功", function() {
|
|
768
833
|
return Promise.all([Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)]).then(function(u) {
|
|
769
|
-
return
|
|
834
|
+
return i(u.join(",") === "1,2,3", "Promise.all 应返回所有结果");
|
|
770
835
|
});
|
|
771
836
|
})), r.push(e("Promise.all - 一个失败则全部失败", function() {
|
|
772
837
|
return Promise.all([Promise.resolve(1), Promise.reject(new Error("error")), Promise.resolve(3)]).catch(function(u) {
|
|
773
|
-
return
|
|
838
|
+
return i(u.message === "error", "Promise.all 中有失败应 reject");
|
|
774
839
|
});
|
|
775
840
|
})), r.push(e("Promise.race - 返回最快的结果", function() {
|
|
776
841
|
var u = new Promise(function(c) {
|
|
777
842
|
return setTimeout(function() {
|
|
778
843
|
return c("slow");
|
|
779
844
|
}, 100);
|
|
780
|
-
}),
|
|
781
|
-
return Promise.race([u,
|
|
782
|
-
return
|
|
845
|
+
}), o = Promise.resolve("fast");
|
|
846
|
+
return Promise.race([u, o]).then(function(c) {
|
|
847
|
+
return i(c === "fast", "Promise.race 应返回最快完成的");
|
|
783
848
|
});
|
|
784
849
|
})), r.push(e("Promise.allSettled - 全部结果", function() {
|
|
785
850
|
return Promise.allSettled([Promise.resolve(1), Promise.reject("err")]).then(function(u) {
|
|
786
|
-
|
|
851
|
+
i(u[0].status === "fulfilled", "allSettled fulfilled"), i(u[1].status === "rejected", "allSettled rejected");
|
|
787
852
|
});
|
|
788
853
|
})), r.push(e("Promise.any - 返回第一个成功", function() {
|
|
789
854
|
return Promise.any([Promise.reject("e1"), Promise.resolve("ok"), Promise.resolve("ok2")]).then(function(u) {
|
|
790
|
-
return
|
|
855
|
+
return i(u === "ok", "Promise.any 应返回第一个成功的值");
|
|
791
856
|
});
|
|
792
857
|
})), r.push(e("async/await 基本用法", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
793
|
-
var
|
|
858
|
+
var o, c, f;
|
|
794
859
|
return _regenerator().w(function(l) {
|
|
795
860
|
for (; ; )
|
|
796
861
|
switch (l.n) {
|
|
797
862
|
case 0:
|
|
798
863
|
return c = function() {
|
|
799
|
-
return c = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function
|
|
864
|
+
return c = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function y() {
|
|
800
865
|
var p;
|
|
801
866
|
return _regenerator().w(function(S) {
|
|
802
867
|
for (; ; )
|
|
@@ -806,25 +871,25 @@ function _testPromises() {
|
|
|
806
871
|
case 1:
|
|
807
872
|
return p = S.v, S.a(2, p);
|
|
808
873
|
}
|
|
809
|
-
},
|
|
874
|
+
}, y);
|
|
810
875
|
})), c.apply(this, arguments);
|
|
811
|
-
},
|
|
876
|
+
}, o = function() {
|
|
812
877
|
return c.apply(this, arguments);
|
|
813
|
-
}, l.n = 1,
|
|
878
|
+
}, l.n = 1, o();
|
|
814
879
|
case 1:
|
|
815
|
-
f = l.v,
|
|
880
|
+
f = l.v, i(f === "data", "async/await 应正确获取异步结果");
|
|
816
881
|
case 2:
|
|
817
882
|
return l.a(2);
|
|
818
883
|
}
|
|
819
884
|
}, u);
|
|
820
885
|
})))), r.push(e("async/await 错误处理", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
821
|
-
var
|
|
886
|
+
var o, c, f;
|
|
822
887
|
return _regenerator().w(function(l) {
|
|
823
888
|
for (; ; )
|
|
824
889
|
switch (l.p = l.n) {
|
|
825
890
|
case 0:
|
|
826
891
|
return c = function() {
|
|
827
|
-
return c = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function
|
|
892
|
+
return c = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function y() {
|
|
828
893
|
return _regenerator().w(function(p) {
|
|
829
894
|
for (; ; )
|
|
830
895
|
switch (p.n) {
|
|
@@ -833,16 +898,16 @@ function _testPromises() {
|
|
|
833
898
|
case 1:
|
|
834
899
|
return p.a(2);
|
|
835
900
|
}
|
|
836
|
-
},
|
|
901
|
+
}, y);
|
|
837
902
|
})), c.apply(this, arguments);
|
|
838
|
-
},
|
|
903
|
+
}, o = function() {
|
|
839
904
|
return c.apply(this, arguments);
|
|
840
|
-
}, l.p = 1, l.n = 2,
|
|
905
|
+
}, l.p = 1, l.n = 2, o();
|
|
841
906
|
case 2:
|
|
842
|
-
|
|
907
|
+
i(!1, "应抛出错误"), l.n = 4;
|
|
843
908
|
break;
|
|
844
909
|
case 3:
|
|
845
|
-
l.p = 3, f = l.v,
|
|
910
|
+
l.p = 3, f = l.v, i(f.message === "async error", "async/await 错误处理");
|
|
846
911
|
case 4:
|
|
847
912
|
return l.a(2);
|
|
848
913
|
}
|
|
@@ -855,14 +920,14 @@ function _testPromises() {
|
|
|
855
920
|
})), _testPromises.apply(this, arguments);
|
|
856
921
|
}
|
|
857
922
|
function testSymbols() {
|
|
858
|
-
var a = createSuite("Symbol"), t = a.test, e = a.assert,
|
|
923
|
+
var a = createSuite("Symbol"), t = a.test, e = a.assert, i = a.getResults;
|
|
859
924
|
return t("Symbol 唯一性", function() {
|
|
860
925
|
var n = Symbol("desc"), r = Symbol("desc");
|
|
861
926
|
e(n !== r, "相同描述的 Symbol 不相等");
|
|
862
|
-
}),
|
|
927
|
+
}), i();
|
|
863
928
|
}
|
|
864
929
|
function testIteratorsGenerators() {
|
|
865
|
-
var a = createSuite("迭代器与生成器"), t = a.test, e = a.assert,
|
|
930
|
+
var a = createSuite("迭代器与生成器"), t = a.test, e = a.assert, i = a.getResults;
|
|
866
931
|
return t("自定义迭代器", function() {
|
|
867
932
|
function n(s) {
|
|
868
933
|
var u = 0;
|
|
@@ -886,21 +951,21 @@ function testIteratorsGenerators() {
|
|
|
886
951
|
n.push(u);
|
|
887
952
|
}
|
|
888
953
|
e(n.join(",") === "10,20,30", "for...of 迭代数组");
|
|
889
|
-
}),
|
|
954
|
+
}), i();
|
|
890
955
|
}
|
|
891
956
|
function testMapSet() {
|
|
892
|
-
var a = createSuite("Map & Set"), t = a.test, e = a.assert,
|
|
957
|
+
var a = createSuite("Map & Set"), t = a.test, e = a.assert, i = a.getResults;
|
|
893
958
|
return t("Map 基本操作", function() {
|
|
894
959
|
var n = /* @__PURE__ */ new Map();
|
|
895
960
|
n.set("a", 1), n.set("b", 2), e(n.get("a") === 1, "Map.get 应返回正确值"), e(n.has("b") === !0, "Map.has 应返回 true"), e(n.size === 2, "Map.size 应为 2"), n.delete("a"), e(n.size === 1, "删除后 size 应为 1");
|
|
896
|
-
}),
|
|
961
|
+
}), i();
|
|
897
962
|
}
|
|
898
963
|
function testProxyReflect() {
|
|
899
|
-
var a = createSuite("Proxy & Reflect"), t = a.test, e = a.assert,
|
|
964
|
+
var a = createSuite("Proxy & Reflect"), t = a.test, e = a.assert, i = a.getResults;
|
|
900
965
|
return t("Proxy get 拦截", function() {
|
|
901
966
|
var n = {
|
|
902
|
-
get: function(u,
|
|
903
|
-
return
|
|
967
|
+
get: function(u, o) {
|
|
968
|
+
return o in u ? u[o] : '属性 "'.concat(o, '" 不存在');
|
|
904
969
|
}
|
|
905
970
|
}, r = new Proxy({
|
|
906
971
|
name: "Alice"
|
|
@@ -908,10 +973,10 @@ function testProxyReflect() {
|
|
|
908
973
|
e(r.name === "Alice", "Proxy get 已有属性"), e(r.age === '属性 "age" 不存在', "Proxy get 不存在属性");
|
|
909
974
|
}), t("Proxy set 拦截与验证", function() {
|
|
910
975
|
var n = {
|
|
911
|
-
set: function(u,
|
|
976
|
+
set: function(u, o, c) {
|
|
912
977
|
if (typeof c != "number")
|
|
913
978
|
throw new TypeError("只允许数字");
|
|
914
|
-
return u[
|
|
979
|
+
return u[o] = c, !0;
|
|
915
980
|
}
|
|
916
981
|
}, r = new Proxy({}, n);
|
|
917
982
|
r.score = 90, e(r.score === 90, "Proxy set 数字");
|
|
@@ -920,10 +985,10 @@ function testProxyReflect() {
|
|
|
920
985
|
} catch (s) {
|
|
921
986
|
e(s instanceof TypeError, "Proxy set 类型校验");
|
|
922
987
|
}
|
|
923
|
-
}),
|
|
988
|
+
}), i();
|
|
924
989
|
}
|
|
925
990
|
function testEnhancedObjects() {
|
|
926
|
-
var a = createSuite("增强对象字面量"), t = a.test, e = a.assert,
|
|
991
|
+
var a = createSuite("增强对象字面量"), t = a.test, e = a.assert, i = a.getResults;
|
|
927
992
|
return t("属性简写", function() {
|
|
928
993
|
var n = "Alice", r = 25, s = {
|
|
929
994
|
name: n,
|
|
@@ -937,10 +1002,10 @@ function testEnhancedObjects() {
|
|
|
937
1002
|
}
|
|
938
1003
|
};
|
|
939
1004
|
e(n.greet("Bob") === "Hello, Bob!", "方法简写");
|
|
940
|
-
}),
|
|
1005
|
+
}), i();
|
|
941
1006
|
}
|
|
942
1007
|
function testNewMethods() {
|
|
943
|
-
var a = createSuite("新增内置方法"), t = a.test, e = a.assert,
|
|
1008
|
+
var a = createSuite("新增内置方法"), t = a.test, e = a.assert, i = a.getResults;
|
|
944
1009
|
return t("Array.from 类数组转换", function() {
|
|
945
1010
|
var n = Array.from("hello");
|
|
946
1011
|
e(n.join(",") === "h,e,l,l,o", "Array.from 字符串");
|
|
@@ -998,14 +1063,14 @@ function testNewMethods() {
|
|
|
998
1063
|
e(Math.trunc(3.9) === 3, "Math.trunc 正数"), e(Math.trunc(-3.9) === -3, "Math.trunc 负数");
|
|
999
1064
|
}), t("Math.cbrt / Math.hypot / Math.log2 / Math.log10", function() {
|
|
1000
1065
|
e(Math.cbrt(27) === 3, "Math.cbrt 立方根"), e(Math.hypot(3, 4) === 5, "Math.hypot 斜边"), e(Math.log2(8) === 3, "Math.log2"), e(Math.log10(1e3) === 3, "Math.log10");
|
|
1001
|
-
}),
|
|
1066
|
+
}), i();
|
|
1002
1067
|
}
|
|
1003
1068
|
const _13NewMethods = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1004
1069
|
__proto__: null,
|
|
1005
1070
|
testNewMethods
|
|
1006
1071
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1007
1072
|
function testModules() {
|
|
1008
|
-
var a = createSuite("模块(Modules)"), t = a.test, e = a.assert,
|
|
1073
|
+
var a = createSuite("模块(Modules)"), t = a.test, e = a.assert, i = a.getResults;
|
|
1009
1074
|
return t("命名导出与导入(本工程已在使用)", function() {
|
|
1010
1075
|
e(typeof testModules == "function", "命名导出的函数可正常被导入调用");
|
|
1011
1076
|
}), t("模块作用域独立", function() {
|
|
@@ -1028,10 +1093,10 @@ function testModules() {
|
|
|
1028
1093
|
}, n);
|
|
1029
1094
|
}))), t("export default 默认导出", function() {
|
|
1030
1095
|
e(!0, '默认导出通过 import x from "..." 引入,本工程采用命名导出模式');
|
|
1031
|
-
}),
|
|
1096
|
+
}), i();
|
|
1032
1097
|
}
|
|
1033
1098
|
function testBinaryOctalUnicode() {
|
|
1034
|
-
var a = createSuite("进制字面量与Unicode"), t = a.test, e = a.assert,
|
|
1099
|
+
var a = createSuite("进制字面量与Unicode"), t = a.test, e = a.assert, i = a.getResults;
|
|
1035
1100
|
return t("二进制字面量 0b", function() {
|
|
1036
1101
|
var n = 10;
|
|
1037
1102
|
e(n === 10, "0b1010 应等于十进制 10"), e(!0, "0b11111111 应等于 255");
|
|
@@ -1057,10 +1122,10 @@ function testBinaryOctalUnicode() {
|
|
|
1057
1122
|
}), t("for...of 正确迭代 Unicode 字符", function() {
|
|
1058
1123
|
var n = "😀A", r = _toConsumableArray(n);
|
|
1059
1124
|
e(r.length === 2, "for...of 正确按码点迭代");
|
|
1060
|
-
}),
|
|
1125
|
+
}), i();
|
|
1061
1126
|
}
|
|
1062
1127
|
function testForOf() {
|
|
1063
|
-
var a = createSuite("for...of 与迭代协议"), t = a.test, e = a.assert,
|
|
1128
|
+
var a = createSuite("for...of 与迭代协议"), t = a.test, e = a.assert, i = a.getResults;
|
|
1064
1129
|
return t("for...of 迭代数组", function() {
|
|
1065
1130
|
for (var n = [], r = 0, s = [1, 2, 3]; r < s.length; r++) {
|
|
1066
1131
|
var u = s[r];
|
|
@@ -1074,8 +1139,8 @@ function testForOf() {
|
|
|
1074
1139
|
var u = s.value;
|
|
1075
1140
|
n.push(u);
|
|
1076
1141
|
}
|
|
1077
|
-
} catch (
|
|
1078
|
-
r.e(
|
|
1142
|
+
} catch (o) {
|
|
1143
|
+
r.e(o);
|
|
1079
1144
|
} finally {
|
|
1080
1145
|
r.f();
|
|
1081
1146
|
}
|
|
@@ -1087,8 +1152,8 @@ function testForOf() {
|
|
|
1087
1152
|
var u = s.value;
|
|
1088
1153
|
n.push(u);
|
|
1089
1154
|
}
|
|
1090
|
-
} catch (
|
|
1091
|
-
r.e(
|
|
1155
|
+
} catch (o) {
|
|
1156
|
+
r.e(o);
|
|
1092
1157
|
} finally {
|
|
1093
1158
|
r.f();
|
|
1094
1159
|
}
|
|
@@ -1097,8 +1162,8 @@ function testForOf() {
|
|
|
1097
1162
|
var n = [], r = _createForOfIteratorHelper(/* @__PURE__ */ new Map([["a", 1], ["b", 2]])), s;
|
|
1098
1163
|
try {
|
|
1099
1164
|
for (r.s(); !(s = r.n()).done; ) {
|
|
1100
|
-
var u = _slicedToArray(s.value, 2),
|
|
1101
|
-
n.push("".concat(
|
|
1165
|
+
var u = _slicedToArray(s.value, 2), o = u[0], c = u[1];
|
|
1166
|
+
n.push("".concat(o, "=").concat(c));
|
|
1102
1167
|
}
|
|
1103
1168
|
} catch (f) {
|
|
1104
1169
|
r.e(f);
|
|
@@ -1111,8 +1176,8 @@ function testForOf() {
|
|
|
1111
1176
|
var r = [], s = _createForOfIteratorHelper(arguments), u;
|
|
1112
1177
|
try {
|
|
1113
1178
|
for (s.s(); !(u = s.n()).done; ) {
|
|
1114
|
-
var
|
|
1115
|
-
r.push(
|
|
1179
|
+
var o = u.value;
|
|
1180
|
+
r.push(o);
|
|
1116
1181
|
}
|
|
1117
1182
|
} catch (c) {
|
|
1118
1183
|
s.e(c);
|
|
@@ -1122,20 +1187,20 @@ function testForOf() {
|
|
|
1122
1187
|
return r;
|
|
1123
1188
|
}
|
|
1124
1189
|
e(n(1, 2, 3).join(",") === "1,2,3", "for...of 迭代 arguments");
|
|
1125
|
-
}),
|
|
1190
|
+
}), i();
|
|
1126
1191
|
}
|
|
1127
1192
|
function testMapGetOrInsert() {
|
|
1128
|
-
var a = createSuite("map getOrInsert"), t = a.test, e = a.assert,
|
|
1193
|
+
var a = createSuite("map getOrInsert"), t = a.test, e = a.assert, i = a.getResults;
|
|
1129
1194
|
return t("getOrInsert - key 已存在返回原值", function() {
|
|
1130
1195
|
var n = /* @__PURE__ */ new Map([["bar", "foo"]]), r = n.getOrInsert("bar", "default");
|
|
1131
1196
|
e(r === "foo", "key 已存在应返回原值 foo");
|
|
1132
|
-
}),
|
|
1197
|
+
}), i();
|
|
1133
1198
|
}
|
|
1134
1199
|
function testClassFields() {
|
|
1135
1200
|
var _createSuite = createSuite("Class Fields (ES2022)"), test = _createSuite.test, assert = _createSuite.assert, getResults = _createSuite.getResults;
|
|
1136
1201
|
return test("公共实例字段 —— 声明并初始化", function() {
|
|
1137
|
-
var a = /* @__PURE__ */ _createClass(function e(
|
|
1138
|
-
_classCallCheck(this, e), _defineProperty(this, "x", 0), _defineProperty(this, "y", 0), this.x =
|
|
1202
|
+
var a = /* @__PURE__ */ _createClass(function e(i, n) {
|
|
1203
|
+
_classCallCheck(this, e), _defineProperty(this, "x", 0), _defineProperty(this, "y", 0), this.x = i, this.y = n;
|
|
1139
1204
|
}), t = new a(3, 4);
|
|
1140
1205
|
assert(t.x === 3 && t.y === 4, "公共字段应可读写");
|
|
1141
1206
|
}), test("公共字段默认值在 constructor 之前初始化", function() {
|
|
@@ -1176,11 +1241,11 @@ function testClassFields() {
|
|
|
1176
1241
|
return _createClass(n, [{
|
|
1177
1242
|
key: "format",
|
|
1178
1243
|
value: function(s) {
|
|
1179
|
-
return _assertClassBrand(t, this,
|
|
1244
|
+
return _assertClassBrand(t, this, i).call(this, s);
|
|
1180
1245
|
}
|
|
1181
1246
|
}]);
|
|
1182
1247
|
}();
|
|
1183
|
-
function
|
|
1248
|
+
function i(n) {
|
|
1184
1249
|
return "".concat(_classPrivateFieldGet2(a, this), " ").concat(n);
|
|
1185
1250
|
}
|
|
1186
1251
|
assert(new e().format("hello") === "[LOG] hello", "私有方法应正常调用");
|
|
@@ -1192,8 +1257,8 @@ function testClassFields() {
|
|
|
1192
1257
|
}), test("静态私有字段 —— 追踪实例数量", function() {
|
|
1193
1258
|
var a = /* @__PURE__ */ function() {
|
|
1194
1259
|
function e() {
|
|
1195
|
-
var
|
|
1196
|
-
_classCallCheck(this, e), t._ = (
|
|
1260
|
+
var i;
|
|
1261
|
+
_classCallCheck(this, e), t._ = (i = t._, i++, i);
|
|
1197
1262
|
}
|
|
1198
1263
|
return _createClass(e, null, [{
|
|
1199
1264
|
key: "getCount",
|
|
@@ -1217,14 +1282,14 @@ function testClassFields() {
|
|
|
1217
1282
|
}
|
|
1218
1283
|
}]);
|
|
1219
1284
|
}();
|
|
1220
|
-
function t(e,
|
|
1221
|
-
return Math.min(Math.max(e,
|
|
1285
|
+
function t(e, i, n) {
|
|
1286
|
+
return Math.min(Math.max(e, i), n);
|
|
1222
1287
|
}
|
|
1223
1288
|
assert(a.normalize(-0.5) === 0, "静态私有方法:低于下界应返回 0"), assert(a.normalize(1.5) === 1, "静态私有方法:超出上界应返回 1"), assert(a.normalize(0.5) === 0.5, "静态私有方法:正常值应原样返回");
|
|
1224
1289
|
}), test("私有字段存在性:`#field in obj`", function() {
|
|
1225
1290
|
var a = /* @__PURE__ */ new WeakMap(), t = /* @__PURE__ */ function() {
|
|
1226
|
-
function e(
|
|
1227
|
-
_classCallCheck(this, e), _classPrivateFieldInitSpec(this, a, void 0), _classPrivateFieldSet2(a, this,
|
|
1291
|
+
function e(i) {
|
|
1292
|
+
_classCallCheck(this, e), _classPrivateFieldInitSpec(this, a, void 0), _classPrivateFieldSet2(a, this, i);
|
|
1228
1293
|
}
|
|
1229
1294
|
return _createClass(e, null, [{
|
|
1230
1295
|
key: "isNode",
|
|
@@ -1255,12 +1320,12 @@ function testClassFields() {
|
|
|
1255
1320
|
return "".concat(this.getName(), " says woof");
|
|
1256
1321
|
}
|
|
1257
1322
|
}]);
|
|
1258
|
-
}(t),
|
|
1259
|
-
assert(
|
|
1323
|
+
}(t), i = new e("Rex");
|
|
1324
|
+
assert(i.bark() === "Rex says woof", "子类可通过父类公共方法访问私有字段");
|
|
1260
1325
|
}), getResults();
|
|
1261
1326
|
}
|
|
1262
1327
|
function testClassStaticBlocks() {
|
|
1263
|
-
var a = createSuite("Class Static Blocks (ES2022)"), t = a.test, e = a.assert,
|
|
1328
|
+
var a = createSuite("Class Static Blocks (ES2022)"), t = a.test, e = a.assert, i = a.getResults;
|
|
1264
1329
|
return t("基本静态块 —— 初始化静态字段", function() {
|
|
1265
1330
|
var n, r = /* @__PURE__ */ _createClass(function s() {
|
|
1266
1331
|
_classCallCheck(this, s);
|
|
@@ -1294,8 +1359,8 @@ function testClassStaticBlocks() {
|
|
|
1294
1359
|
}(), s = {
|
|
1295
1360
|
_: "initial"
|
|
1296
1361
|
};
|
|
1297
|
-
n = function(
|
|
1298
|
-
s._ =
|
|
1362
|
+
n = function(o) {
|
|
1363
|
+
s._ = o;
|
|
1299
1364
|
}, n("updated"), e(r.getSecret() === "updated", "静态块应能操作同类私有字段");
|
|
1300
1365
|
}), t("多个静态块按声明顺序执行", function() {
|
|
1301
1366
|
var n, r = [], s = /* @__PURE__ */ _createClass(function u() {
|
|
@@ -1321,10 +1386,10 @@ function testClassStaticBlocks() {
|
|
|
1321
1386
|
n = r, _defineProperty(r, "name2", "Widget"), _defineProperty(r, "instance", void 0), n.instance = {
|
|
1322
1387
|
type: n.name2
|
|
1323
1388
|
}, e(r.instance.type === "Widget", "静态块内 this 应指向类本身");
|
|
1324
|
-
}),
|
|
1389
|
+
}), i();
|
|
1325
1390
|
}
|
|
1326
1391
|
function testAtMethod() {
|
|
1327
|
-
var a = createSuite("Array/String.at() (ES2022)"), t = a.test, e = a.assert,
|
|
1392
|
+
var a = createSuite("Array/String.at() (ES2022)"), t = a.test, e = a.assert, i = a.getResults;
|
|
1328
1393
|
return t("Array.at() —— 正索引与 arr[i] 等价", function() {
|
|
1329
1394
|
var n = [10, 20, 30, 40, 50];
|
|
1330
1395
|
e(n.at(0) === 10, "at(0) 应返回第一个元素"), e(n.at(2) === 30, "at(2) 应返回第三个元素"), e(n.at(4) === 50, "at(4) 应返回最后一个元素");
|
|
@@ -1353,10 +1418,10 @@ function testAtMethod() {
|
|
|
1353
1418
|
}), t("at() 不修改原数组", function() {
|
|
1354
1419
|
var n = [1, 2, 3];
|
|
1355
1420
|
e(n.length === 3 && n[2] === 3, "at() 不应修改原数组");
|
|
1356
|
-
}),
|
|
1421
|
+
}), i();
|
|
1357
1422
|
}
|
|
1358
1423
|
function testObjectHasOwn() {
|
|
1359
|
-
var a = createSuite("Object.hasOwn() (ES2022)"), t = a.test, e = a.assert,
|
|
1424
|
+
var a = createSuite("Object.hasOwn() (ES2022)"), t = a.test, e = a.assert, i = a.getResults;
|
|
1360
1425
|
return t("基本用法 —— 自有属性返回 true", function() {
|
|
1361
1426
|
var n = {
|
|
1362
1427
|
name: "Alice",
|
|
@@ -1369,13 +1434,13 @@ function testObjectHasOwn() {
|
|
|
1369
1434
|
};
|
|
1370
1435
|
e(Object.hasOwn(n, "b") === !1, "不存在的属性应返回 false"), e(Object.hasOwn(n, "toString") === !1, "原型链上的属性应返回 false");
|
|
1371
1436
|
}), t("继承属性返回 false —— 只检查自有属性", function() {
|
|
1372
|
-
var n = /* @__PURE__ */ _createClass(function u(
|
|
1373
|
-
_classCallCheck(this, u), this.name =
|
|
1437
|
+
var n = /* @__PURE__ */ _createClass(function u(o) {
|
|
1438
|
+
_classCallCheck(this, u), this.name = o;
|
|
1374
1439
|
}), r = /* @__PURE__ */ function(u) {
|
|
1375
|
-
function
|
|
1376
|
-
return _classCallCheck(this,
|
|
1440
|
+
function o() {
|
|
1441
|
+
return _classCallCheck(this, o), _callSuper(this, o, arguments);
|
|
1377
1442
|
}
|
|
1378
|
-
return _inherits(
|
|
1443
|
+
return _inherits(o, u), _createClass(o);
|
|
1379
1444
|
}(n), s = new r("Rex");
|
|
1380
1445
|
e(Object.hasOwn(s, "name") === !0, "name 是实例自有属性"), e(Object.hasOwn(s, "constructor") === !1, "constructor 在原型上,不是自有属性");
|
|
1381
1446
|
}), t("null 原型对象 —— hasOwnProperty 不可用时的安全方案", function() {
|
|
@@ -1408,10 +1473,10 @@ function testObjectHasOwn() {
|
|
|
1408
1473
|
}), t("数组的索引属性", function() {
|
|
1409
1474
|
var n = [10, 20, 30];
|
|
1410
1475
|
e(Object.hasOwn(n, 0) === !0, "数组索引 0 是自有属性"), e(Object.hasOwn(n, "1") === !0, '字符串索引 "1" 也是自有属性'), e(Object.hasOwn(n, "length") === !0, "length 是数组的自有属性"), e(Object.hasOwn(n, 3) === !1, "越界索引应返回 false");
|
|
1411
|
-
}),
|
|
1476
|
+
}), i();
|
|
1412
1477
|
}
|
|
1413
1478
|
function testErrorCause() {
|
|
1414
|
-
var a = createSuite("Error Cause (ES2022)"), t = a.test, e = a.assert,
|
|
1479
|
+
var a = createSuite("Error Cause (ES2022)"), t = a.test, e = a.assert, i = a.getResults;
|
|
1415
1480
|
return t("基本用法 —— cause 属性保存原始错误", function() {
|
|
1416
1481
|
var n = new TypeError("原始类型错误"), r = new Error("操作失败", {
|
|
1417
1482
|
cause: n
|
|
@@ -1450,22 +1515,22 @@ function testErrorCause() {
|
|
|
1450
1515
|
});
|
|
1451
1516
|
e(n.cause === "网络超时", "cause 可以是字符串"), e(r.cause === 404, "cause 可以是数字"), e(s.cause.code === "ENOENT", "cause 可以是对象");
|
|
1452
1517
|
}), t("实际应用:fetch 封装中传递原始网络错误", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function n() {
|
|
1453
|
-
var r, s, u,
|
|
1518
|
+
var r, s, u, o;
|
|
1454
1519
|
return _regenerator().w(function(c) {
|
|
1455
1520
|
for (; ; )
|
|
1456
1521
|
switch (c.p = c.n) {
|
|
1457
1522
|
case 0:
|
|
1458
1523
|
return s = function() {
|
|
1459
|
-
return s = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function l(
|
|
1460
|
-
var
|
|
1524
|
+
return s = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function l(h) {
|
|
1525
|
+
var y;
|
|
1461
1526
|
return _regenerator().w(function(p) {
|
|
1462
1527
|
for (; ; )
|
|
1463
1528
|
switch (p.p = p.n) {
|
|
1464
1529
|
case 0:
|
|
1465
1530
|
throw p.p = 0, new Error("fetch failed: 500");
|
|
1466
1531
|
case 1:
|
|
1467
|
-
throw p.p = 1,
|
|
1468
|
-
cause:
|
|
1532
|
+
throw p.p = 1, y = p.v, new Error("获取用户 ".concat(h, " 失败"), {
|
|
1533
|
+
cause: y
|
|
1469
1534
|
});
|
|
1470
1535
|
case 2:
|
|
1471
1536
|
return p.a(2);
|
|
@@ -1479,7 +1544,7 @@ function testErrorCause() {
|
|
|
1479
1544
|
c.n = 4;
|
|
1480
1545
|
break;
|
|
1481
1546
|
case 3:
|
|
1482
|
-
c.p = 3,
|
|
1547
|
+
c.p = 3, o = c.v, u = o;
|
|
1483
1548
|
case 4:
|
|
1484
1549
|
e(u !== null, "应捕获到封装后的错误"), e(u.message.includes("42"), "外层错误消息应包含用户 id"), e(u.cause instanceof Error, "cause 应是原始 Error"), e(u.cause.message.includes("500"), "原始错误消息应保留");
|
|
1485
1550
|
case 5:
|
|
@@ -1488,19 +1553,19 @@ function testErrorCause() {
|
|
|
1488
1553
|
}, n, null, [[1, 3]]);
|
|
1489
1554
|
}))), t("自定义 Error 子类也支持 cause", function() {
|
|
1490
1555
|
var n = /* @__PURE__ */ function(u) {
|
|
1491
|
-
function
|
|
1556
|
+
function o(c, f) {
|
|
1492
1557
|
var l;
|
|
1493
|
-
return _classCallCheck(this,
|
|
1558
|
+
return _classCallCheck(this, o), l = _callSuper(this, o, [c, f]), l.name = "AppError", l;
|
|
1494
1559
|
}
|
|
1495
|
-
return _inherits(
|
|
1560
|
+
return _inherits(o, u), _createClass(o);
|
|
1496
1561
|
}(/* @__PURE__ */ _wrapNativeSuper(Error)), r = new TypeError("底层失败"), s = new n("应用层失败", {
|
|
1497
1562
|
cause: r
|
|
1498
1563
|
});
|
|
1499
1564
|
e(s.name === "AppError", "子类名称应正确"), e(s.cause === r, "自定义子类应支持 cause");
|
|
1500
|
-
}),
|
|
1565
|
+
}), i();
|
|
1501
1566
|
}
|
|
1502
1567
|
function testRegExpDFlag() {
|
|
1503
|
-
var a = createSuite("RegExp /d flag (ES2022)"), t = a.test, e = a.assert,
|
|
1568
|
+
var a = createSuite("RegExp /d flag (ES2022)"), t = a.test, e = a.assert, i = a.getResults, n = function() {
|
|
1504
1569
|
try {
|
|
1505
1570
|
return new RegExp("x", "d").hasIndices === !0;
|
|
1506
1571
|
} catch {
|
|
@@ -1534,8 +1599,8 @@ function testRegExpDFlag() {
|
|
|
1534
1599
|
e(!0, "(跳过)");
|
|
1535
1600
|
return;
|
|
1536
1601
|
}
|
|
1537
|
-
var r = "姓名:Alice,年龄:30", s = new RegExp("姓名:(\\w+),年龄:(\\d+)", "d"), u = r.match(s),
|
|
1538
|
-
e(r.slice(c, f) === "Alice", "通过 indices 切出的姓名应为 Alice"), e(r.slice(
|
|
1602
|
+
var r = "姓名:Alice,年龄:30", s = new RegExp("姓名:(\\w+),年龄:(\\d+)", "d"), u = r.match(s), o = _slicedToArray(u.indices[1], 2), c = o[0], f = o[1], l = _slicedToArray(u.indices[2], 2), h = l[0], y = l[1];
|
|
1603
|
+
e(r.slice(c, f) === "Alice", "通过 indices 切出的姓名应为 Alice"), e(r.slice(h, y) === "30", "通过 indices 切出的年龄应为 30");
|
|
1539
1604
|
}), t("具名捕获组的位置 indices.groups", function() {
|
|
1540
1605
|
var r, s;
|
|
1541
1606
|
if (!n) {
|
|
@@ -1545,9 +1610,9 @@ function testRegExpDFlag() {
|
|
|
1545
1610
|
var u = /* @__PURE__ */ _wrapRegExp(new RegExp("(\\d{4})-(\\d{2})", "d"), {
|
|
1546
1611
|
year: 1,
|
|
1547
1612
|
month: 2
|
|
1548
|
-
}),
|
|
1549
|
-
e(
|
|
1550
|
-
var c =
|
|
1613
|
+
}), o = "发布于 2025-06".match(u);
|
|
1614
|
+
e(o.indices.groups !== void 0, "具名组应出现在 indices.groups 中");
|
|
1615
|
+
var c = o.indices.groups, f = c.year, l = c.month;
|
|
1551
1616
|
e((r = "发布于 2025-06").slice.apply(r, _toConsumableArray(f)) === "2025", "具名组 year 位置应正确"), e((s = "发布于 2025-06").slice.apply(s, _toConsumableArray(l)) === "06", "具名组 month 位置应正确");
|
|
1552
1617
|
}), t("未匹配的可选组 indices 为 undefined", function() {
|
|
1553
1618
|
if (!n) {
|
|
@@ -1561,38 +1626,38 @@ function testRegExpDFlag() {
|
|
|
1561
1626
|
e(!0, "(跳过)");
|
|
1562
1627
|
return;
|
|
1563
1628
|
}
|
|
1564
|
-
for (var r = new RegExp("\\d+", "dg"), s = "a1b22c333", u = [],
|
|
1565
|
-
u.push(
|
|
1629
|
+
for (var r = new RegExp("\\d+", "dg"), s = "a1b22c333", u = [], o; (o = r.exec(s)) !== null; )
|
|
1630
|
+
u.push(o.indices[0]);
|
|
1566
1631
|
e(u.length === 3, "应匹配到 3 个数字"), e(u[0][0] === 1, "第一个数字起始位置应为 1"), e(u[1][0] === 3, "第二个数字起始位置应为 3"), e(u[2][0] === 6, "第三个数字起始位置应为 6");
|
|
1567
|
-
}),
|
|
1632
|
+
}), i();
|
|
1568
1633
|
}
|
|
1569
1634
|
function testTopLevelAwait() {
|
|
1570
1635
|
return _testTopLevelAwait.apply(this, arguments);
|
|
1571
1636
|
}
|
|
1572
1637
|
function _testTopLevelAwait() {
|
|
1573
1638
|
return _testTopLevelAwait = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function a() {
|
|
1574
|
-
var t, e,
|
|
1639
|
+
var t, e, i, n;
|
|
1575
1640
|
return _regenerator().w(function(r) {
|
|
1576
1641
|
for (; ; )
|
|
1577
1642
|
switch (r.n) {
|
|
1578
1643
|
case 0:
|
|
1579
|
-
return t = createSuite("Top-level await (ES2022)"), e = t.test,
|
|
1644
|
+
return t = createSuite("Top-level await (ES2022)"), e = t.test, i = t.assert, n = t.getResults, r.n = 1, e("async 函数内的 await 是等价基础能力", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function s() {
|
|
1580
1645
|
var u;
|
|
1581
|
-
return _regenerator().w(function(
|
|
1646
|
+
return _regenerator().w(function(o) {
|
|
1582
1647
|
for (; ; )
|
|
1583
|
-
switch (
|
|
1648
|
+
switch (o.n) {
|
|
1584
1649
|
case 0:
|
|
1585
|
-
return
|
|
1650
|
+
return o.n = 1, Promise.resolve(42);
|
|
1586
1651
|
case 1:
|
|
1587
|
-
u =
|
|
1652
|
+
u = o.v, i(u === 42, "await 在 async 函数顶层应正常工作");
|
|
1588
1653
|
case 2:
|
|
1589
|
-
return
|
|
1654
|
+
return o.a(2);
|
|
1590
1655
|
}
|
|
1591
1656
|
}, s);
|
|
1592
1657
|
})));
|
|
1593
1658
|
case 1:
|
|
1594
1659
|
return r.n = 2, e("await 可以等待动态 import()", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function s() {
|
|
1595
|
-
var u,
|
|
1660
|
+
var u, o;
|
|
1596
1661
|
return _regenerator().w(function(c) {
|
|
1597
1662
|
for (; ; )
|
|
1598
1663
|
switch (c.n) {
|
|
@@ -1606,7 +1671,7 @@ function _testTopLevelAwait() {
|
|
|
1606
1671
|
});
|
|
1607
1672
|
}, c.n = 1, u();
|
|
1608
1673
|
case 1:
|
|
1609
|
-
|
|
1674
|
+
o = c.v, i(o.default === "module-content", "await 动态导入应返回模块内容"), i(o.util() === "ok", "模块导出的函数应可调用");
|
|
1610
1675
|
case 2:
|
|
1611
1676
|
return c.a(2);
|
|
1612
1677
|
}
|
|
@@ -1614,7 +1679,7 @@ function _testTopLevelAwait() {
|
|
|
1614
1679
|
})));
|
|
1615
1680
|
case 2:
|
|
1616
1681
|
return r.n = 3, e("await 保序 —— 导入方等待模块初始化完成", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function s() {
|
|
1617
|
-
var u,
|
|
1682
|
+
var u, o;
|
|
1618
1683
|
return _regenerator().w(function(c) {
|
|
1619
1684
|
for (; ; )
|
|
1620
1685
|
switch (c.n) {
|
|
@@ -1624,8 +1689,8 @@ function _testTopLevelAwait() {
|
|
|
1624
1689
|
for (; ; )
|
|
1625
1690
|
switch (l.n) {
|
|
1626
1691
|
case 0:
|
|
1627
|
-
return u.push("A:start"), l.n = 1, new Promise(function(
|
|
1628
|
-
return setTimeout(
|
|
1692
|
+
return u.push("A:start"), l.n = 1, new Promise(function(h) {
|
|
1693
|
+
return setTimeout(h, 0);
|
|
1629
1694
|
});
|
|
1630
1695
|
case 1:
|
|
1631
1696
|
return u.push("A:ready"), l.a(2, {
|
|
@@ -1635,7 +1700,7 @@ function _testTopLevelAwait() {
|
|
|
1635
1700
|
}, f);
|
|
1636
1701
|
}))();
|
|
1637
1702
|
case 1:
|
|
1638
|
-
|
|
1703
|
+
o = c.v, u.push("B:use"), i(o.data === "initialized", "模块 A 初始化完成后才能被使用"), i(u.join(",") === "A:start,A:ready,B:use", "执行顺序应严格保序");
|
|
1639
1704
|
case 2:
|
|
1640
1705
|
return c.a(2);
|
|
1641
1706
|
}
|
|
@@ -1643,14 +1708,14 @@ function _testTopLevelAwait() {
|
|
|
1643
1708
|
})));
|
|
1644
1709
|
case 3:
|
|
1645
1710
|
return r.n = 4, e("await 与条件导入模拟", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function s() {
|
|
1646
|
-
var u,
|
|
1711
|
+
var u, o;
|
|
1647
1712
|
return _regenerator().w(function(c) {
|
|
1648
1713
|
for (; ; )
|
|
1649
1714
|
switch (c.n) {
|
|
1650
1715
|
case 0:
|
|
1651
1716
|
return u = typeof window < "u", c.n = 1, Promise.resolve(u ? "browser" : "node");
|
|
1652
1717
|
case 1:
|
|
1653
|
-
|
|
1718
|
+
o = c.v, i(typeof o == "string", "条件 await 应返回字符串平台标识"), i(o === "browser" || o === "node", "平台标识应为 browser 或 node");
|
|
1654
1719
|
case 2:
|
|
1655
1720
|
return c.a(2);
|
|
1656
1721
|
}
|
|
@@ -1658,7 +1723,7 @@ function _testTopLevelAwait() {
|
|
|
1658
1723
|
})));
|
|
1659
1724
|
case 4:
|
|
1660
1725
|
return r.n = 5, e("await 错误应在模块加载阶段被捕获", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function s() {
|
|
1661
|
-
var u,
|
|
1726
|
+
var u, o;
|
|
1662
1727
|
return _regenerator().w(function(c) {
|
|
1663
1728
|
for (; ; )
|
|
1664
1729
|
switch (c.p = c.n) {
|
|
@@ -1668,9 +1733,9 @@ function _testTopLevelAwait() {
|
|
|
1668
1733
|
c.n = 4;
|
|
1669
1734
|
break;
|
|
1670
1735
|
case 3:
|
|
1671
|
-
c.p = 3,
|
|
1736
|
+
c.p = 3, o = c.v, u = o;
|
|
1672
1737
|
case 4:
|
|
1673
|
-
|
|
1738
|
+
i(u instanceof Error, "应捕获到 Error"), i(u.message === "模块初始化失败", "错误消息应正确传递");
|
|
1674
1739
|
case 5:
|
|
1675
1740
|
return c.a(2);
|
|
1676
1741
|
}
|
|
@@ -1678,12 +1743,12 @@ function _testTopLevelAwait() {
|
|
|
1678
1743
|
})));
|
|
1679
1744
|
case 5:
|
|
1680
1745
|
return r.n = 6, e("await 不阻塞无依赖的兄弟模块(并行加载)", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function s() {
|
|
1681
|
-
var u,
|
|
1682
|
-
return _regenerator().w(function(
|
|
1746
|
+
var u, o, c, f, l, h;
|
|
1747
|
+
return _regenerator().w(function(y) {
|
|
1683
1748
|
for (; ; )
|
|
1684
|
-
switch (
|
|
1749
|
+
switch (y.n) {
|
|
1685
1750
|
case 0:
|
|
1686
|
-
return u = Date.now(),
|
|
1751
|
+
return u = Date.now(), y.n = 1, Promise.all([new Promise(function(p) {
|
|
1687
1752
|
return setTimeout(function() {
|
|
1688
1753
|
return p("A");
|
|
1689
1754
|
}, 10);
|
|
@@ -1693,9 +1758,9 @@ function _testTopLevelAwait() {
|
|
|
1693
1758
|
}, 10);
|
|
1694
1759
|
})]);
|
|
1695
1760
|
case 1:
|
|
1696
|
-
|
|
1761
|
+
o = y.v, c = _slicedToArray(o, 2), f = c[0], l = c[1], h = Date.now() - u, i(f === "A" && l === "B", "并行 await 两个模块都应成功完成"), i(h < 50, "并行执行耗时应远小于串行(~10ms vs ~20ms)");
|
|
1697
1762
|
case 2:
|
|
1698
|
-
return
|
|
1763
|
+
return y.a(2);
|
|
1699
1764
|
}
|
|
1700
1765
|
}, s);
|
|
1701
1766
|
})));
|
|
@@ -1706,7 +1771,7 @@ function _testTopLevelAwait() {
|
|
|
1706
1771
|
})), _testTopLevelAwait.apply(this, arguments);
|
|
1707
1772
|
}
|
|
1708
1773
|
function testIteratorHelpers() {
|
|
1709
|
-
var a = createSuite("Iterator Helpers (ES2025)"), t = a.test, e = a.assert,
|
|
1774
|
+
var a = createSuite("Iterator Helpers (ES2025)"), t = a.test, e = a.assert, i = a.getResults, n = typeof Iterator < "u" && typeof Iterator.from == "function";
|
|
1710
1775
|
return t("环境支持检测", function() {
|
|
1711
1776
|
e(n, "环境不支持 Iterator Helpers");
|
|
1712
1777
|
}), t("Iterator.from() 将可迭代对象转为迭代器", function() {
|
|
@@ -1813,10 +1878,10 @@ function testIteratorHelpers() {
|
|
|
1813
1878
|
return s > 10;
|
|
1814
1879
|
}).take(3).toArray();
|
|
1815
1880
|
e(r.length === 3 && r[0] === 16 && r[2] === 36, "链式调用结果应为 [16,25,36]");
|
|
1816
|
-
}),
|
|
1881
|
+
}), i();
|
|
1817
1882
|
}
|
|
1818
1883
|
function testSetMethods() {
|
|
1819
|
-
var a = createSuite("New Set Methods (ES2025)"), t = a.test, e = a.assert,
|
|
1884
|
+
var a = createSuite("New Set Methods (ES2025)"), t = a.test, e = a.assert, i = a.getResults, n = typeof Set.prototype.union == "function";
|
|
1820
1885
|
return t("环境支持检测", function() {
|
|
1821
1886
|
e(n, "环境不支持 Set 新方法(union/intersection 等)");
|
|
1822
1887
|
}), t("union() —— 并集", function() {
|
|
@@ -1882,38 +1947,38 @@ function testSetMethods() {
|
|
|
1882
1947
|
}
|
|
1883
1948
|
var r = /* @__PURE__ */ new Set([1, 2, 3]), s = r.intersection(/* @__PURE__ */ new Set([2, 3, 4]));
|
|
1884
1949
|
e(s.size === 2 && s.has(2) && s.has(3), "应支持传入普通数组");
|
|
1885
|
-
}),
|
|
1950
|
+
}), i();
|
|
1886
1951
|
}
|
|
1887
1952
|
function testPromiseTry() {
|
|
1888
1953
|
return _testPromiseTry.apply(this, arguments);
|
|
1889
1954
|
}
|
|
1890
1955
|
function _testPromiseTry() {
|
|
1891
1956
|
return _testPromiseTry = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function a() {
|
|
1892
|
-
var t, e,
|
|
1957
|
+
var t, e, i, n, r;
|
|
1893
1958
|
return _regenerator().w(function(s) {
|
|
1894
1959
|
for (; ; )
|
|
1895
1960
|
switch (s.n) {
|
|
1896
1961
|
case 0:
|
|
1897
|
-
return t = createSuite("Promise.try (ES2025)"), e = t.test,
|
|
1898
|
-
return _regenerator().w(function(
|
|
1962
|
+
return t = createSuite("Promise.try (ES2025)"), e = t.test, i = t.assert, n = t.getResults, r = typeof Promise.try == "function", s.n = 1, e("环境支持检测", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
1963
|
+
return _regenerator().w(function(o) {
|
|
1899
1964
|
for (; ; )
|
|
1900
|
-
switch (
|
|
1965
|
+
switch (o.n) {
|
|
1901
1966
|
case 0:
|
|
1902
1967
|
if (r) {
|
|
1903
|
-
|
|
1968
|
+
o.n = 1;
|
|
1904
1969
|
break;
|
|
1905
1970
|
}
|
|
1906
|
-
return
|
|
1971
|
+
return i(!1, "(环境不支持 Promise.try)"), o.a(2);
|
|
1907
1972
|
case 1:
|
|
1908
|
-
|
|
1973
|
+
i(!0, "环境支持 Promise.try");
|
|
1909
1974
|
case 2:
|
|
1910
|
-
return
|
|
1975
|
+
return o.a(2);
|
|
1911
1976
|
}
|
|
1912
1977
|
}, u);
|
|
1913
1978
|
})));
|
|
1914
1979
|
case 1:
|
|
1915
1980
|
return s.n = 2, e("同步函数 —— 返回值转为 resolved", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
1916
|
-
var
|
|
1981
|
+
var o;
|
|
1917
1982
|
return _regenerator().w(function(c) {
|
|
1918
1983
|
for (; ; )
|
|
1919
1984
|
switch (c.n) {
|
|
@@ -1922,13 +1987,13 @@ function _testPromiseTry() {
|
|
|
1922
1987
|
c.n = 1;
|
|
1923
1988
|
break;
|
|
1924
1989
|
}
|
|
1925
|
-
return
|
|
1990
|
+
return i(!0, "(跳过:环境不支持 Promise.try)"), c.a(2);
|
|
1926
1991
|
case 1:
|
|
1927
1992
|
return c.n = 2, Promise.try(function() {
|
|
1928
1993
|
return 42;
|
|
1929
1994
|
});
|
|
1930
1995
|
case 2:
|
|
1931
|
-
|
|
1996
|
+
o = c.v, i(o === 42, "同步返回值应被 resolve 为 42");
|
|
1932
1997
|
case 3:
|
|
1933
1998
|
return c.a(2);
|
|
1934
1999
|
}
|
|
@@ -1936,7 +2001,7 @@ function _testPromiseTry() {
|
|
|
1936
2001
|
})));
|
|
1937
2002
|
case 2:
|
|
1938
2003
|
return s.n = 3, e("同步函数 —— 抛出异常转为 rejected", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
1939
|
-
var
|
|
2004
|
+
var o;
|
|
1940
2005
|
return _regenerator().w(function(c) {
|
|
1941
2006
|
for (; ; )
|
|
1942
2007
|
switch (c.n) {
|
|
@@ -1945,15 +2010,15 @@ function _testPromiseTry() {
|
|
|
1945
2010
|
c.n = 1;
|
|
1946
2011
|
break;
|
|
1947
2012
|
}
|
|
1948
|
-
return
|
|
2013
|
+
return i(!0, "(跳过)"), c.a(2);
|
|
1949
2014
|
case 1:
|
|
1950
|
-
return
|
|
2015
|
+
return o = null, c.n = 2, Promise.try(function() {
|
|
1951
2016
|
throw new Error("同步错误");
|
|
1952
2017
|
}).catch(function(f) {
|
|
1953
|
-
|
|
2018
|
+
o = f;
|
|
1954
2019
|
});
|
|
1955
2020
|
case 2:
|
|
1956
|
-
o
|
|
2021
|
+
i(o instanceof Error && o.message === "同步错误", "同步异常应转为 rejected");
|
|
1957
2022
|
case 3:
|
|
1958
2023
|
return c.a(2);
|
|
1959
2024
|
}
|
|
@@ -1961,7 +2026,7 @@ function _testPromiseTry() {
|
|
|
1961
2026
|
})));
|
|
1962
2027
|
case 3:
|
|
1963
2028
|
return s.n = 4, e("异步函数 —— resolved 正常透传", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
1964
|
-
var
|
|
2029
|
+
var o;
|
|
1965
2030
|
return _regenerator().w(function(c) {
|
|
1966
2031
|
for (; ; )
|
|
1967
2032
|
switch (c.n) {
|
|
@@ -1970,7 +2035,7 @@ function _testPromiseTry() {
|
|
|
1970
2035
|
c.n = 1;
|
|
1971
2036
|
break;
|
|
1972
2037
|
}
|
|
1973
|
-
return
|
|
2038
|
+
return i(!0, "(跳过)"), c.a(2);
|
|
1974
2039
|
case 1:
|
|
1975
2040
|
return c.n = 2, Promise.try(/* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function f() {
|
|
1976
2041
|
return _regenerator().w(function(l) {
|
|
@@ -1982,7 +2047,7 @@ function _testPromiseTry() {
|
|
|
1982
2047
|
}, f);
|
|
1983
2048
|
})));
|
|
1984
2049
|
case 2:
|
|
1985
|
-
|
|
2050
|
+
o = c.v, i(o === "async result", "异步 resolved 值应透传");
|
|
1986
2051
|
case 3:
|
|
1987
2052
|
return c.a(2);
|
|
1988
2053
|
}
|
|
@@ -1990,7 +2055,7 @@ function _testPromiseTry() {
|
|
|
1990
2055
|
})));
|
|
1991
2056
|
case 4:
|
|
1992
2057
|
return s.n = 5, e("异步函数 —— rejected 正常透传", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
1993
|
-
var
|
|
2058
|
+
var o;
|
|
1994
2059
|
return _regenerator().w(function(c) {
|
|
1995
2060
|
for (; ; )
|
|
1996
2061
|
switch (c.n) {
|
|
@@ -1999,9 +2064,9 @@ function _testPromiseTry() {
|
|
|
1999
2064
|
c.n = 1;
|
|
2000
2065
|
break;
|
|
2001
2066
|
}
|
|
2002
|
-
return
|
|
2067
|
+
return i(!0, "(跳过)"), c.a(2);
|
|
2003
2068
|
case 1:
|
|
2004
|
-
return
|
|
2069
|
+
return o = null, c.n = 2, Promise.try(/* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function f() {
|
|
2005
2070
|
return _regenerator().w(function(l) {
|
|
2006
2071
|
for (; ; )
|
|
2007
2072
|
switch (l.n) {
|
|
@@ -2012,10 +2077,10 @@ function _testPromiseTry() {
|
|
|
2012
2077
|
}
|
|
2013
2078
|
}, f);
|
|
2014
2079
|
}))).catch(function(f) {
|
|
2015
|
-
|
|
2080
|
+
o = f;
|
|
2016
2081
|
});
|
|
2017
2082
|
case 2:
|
|
2018
|
-
o
|
|
2083
|
+
i(o instanceof Error && o.message === "异步错误", "异步 rejected 应透传");
|
|
2019
2084
|
case 3:
|
|
2020
2085
|
return c.a(2);
|
|
2021
2086
|
}
|
|
@@ -2023,7 +2088,7 @@ function _testPromiseTry() {
|
|
|
2023
2088
|
})));
|
|
2024
2089
|
case 5:
|
|
2025
2090
|
return s.n = 6, e("返回已有 Promise —— 直接透传", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
2026
|
-
var
|
|
2091
|
+
var o, c;
|
|
2027
2092
|
return _regenerator().w(function(f) {
|
|
2028
2093
|
for (; ; )
|
|
2029
2094
|
switch (f.n) {
|
|
@@ -2032,13 +2097,13 @@ function _testPromiseTry() {
|
|
|
2032
2097
|
f.n = 1;
|
|
2033
2098
|
break;
|
|
2034
2099
|
}
|
|
2035
|
-
return
|
|
2100
|
+
return i(!0, "(跳过)"), f.a(2);
|
|
2036
2101
|
case 1:
|
|
2037
|
-
return
|
|
2038
|
-
return
|
|
2102
|
+
return o = Promise.resolve("original"), f.n = 2, Promise.try(function() {
|
|
2103
|
+
return o;
|
|
2039
2104
|
});
|
|
2040
2105
|
case 2:
|
|
2041
|
-
c = f.v,
|
|
2106
|
+
c = f.v, i(c === "original", "返回已有 Promise 的值应直接透传");
|
|
2042
2107
|
case 3:
|
|
2043
2108
|
return f.a(2);
|
|
2044
2109
|
}
|
|
@@ -2046,7 +2111,7 @@ function _testPromiseTry() {
|
|
|
2046
2111
|
})));
|
|
2047
2112
|
case 6:
|
|
2048
2113
|
return s.n = 7, e("传递参数给回调函数", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
2049
|
-
var
|
|
2114
|
+
var o;
|
|
2050
2115
|
return _regenerator().w(function(c) {
|
|
2051
2116
|
for (; ; )
|
|
2052
2117
|
switch (c.n) {
|
|
@@ -2055,13 +2120,13 @@ function _testPromiseTry() {
|
|
|
2055
2120
|
c.n = 1;
|
|
2056
2121
|
break;
|
|
2057
2122
|
}
|
|
2058
|
-
return
|
|
2123
|
+
return i(!0, "(跳过)"), c.a(2);
|
|
2059
2124
|
case 1:
|
|
2060
2125
|
return c.n = 2, Promise.try(function(f, l) {
|
|
2061
2126
|
return f + l;
|
|
2062
2127
|
}, 10, 20);
|
|
2063
2128
|
case 2:
|
|
2064
|
-
|
|
2129
|
+
o = c.v, i(o === 30, "应能向回调函数传递参数");
|
|
2065
2130
|
case 3:
|
|
2066
2131
|
return c.a(2);
|
|
2067
2132
|
}
|
|
@@ -2069,7 +2134,7 @@ function _testPromiseTry() {
|
|
|
2069
2134
|
})));
|
|
2070
2135
|
case 7:
|
|
2071
2136
|
return s.n = 8, e("对比 new Promise —— 捕获同步异常的等价写法", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
2072
|
-
var
|
|
2137
|
+
var o, c, f, l, h, y;
|
|
2073
2138
|
return _regenerator().w(function(p) {
|
|
2074
2139
|
for (; ; )
|
|
2075
2140
|
switch (p.n) {
|
|
@@ -2078,15 +2143,15 @@ function _testPromiseTry() {
|
|
|
2078
2143
|
p.n = 1;
|
|
2079
2144
|
break;
|
|
2080
2145
|
}
|
|
2081
|
-
return
|
|
2146
|
+
return i(!0, "(跳过)"), p.a(2);
|
|
2082
2147
|
case 1:
|
|
2083
|
-
return
|
|
2148
|
+
return o = new Promise(function(S) {
|
|
2084
2149
|
return S(JSON.parse('{"key":"value"}'));
|
|
2085
2150
|
}), c = Promise.try(function() {
|
|
2086
2151
|
return JSON.parse('{"key":"value"}');
|
|
2087
|
-
}), p.n = 2, Promise.all([
|
|
2152
|
+
}), p.n = 2, Promise.all([o, c]);
|
|
2088
2153
|
case 2:
|
|
2089
|
-
f = p.v, l = _slicedToArray(f, 2),
|
|
2154
|
+
f = p.v, l = _slicedToArray(f, 2), h = l[0], y = l[1], i(h.key === "value" && y.key === "value", "两种写法结果应一致");
|
|
2090
2155
|
case 3:
|
|
2091
2156
|
return p.a(2);
|
|
2092
2157
|
}
|
|
@@ -2099,7 +2164,7 @@ function _testPromiseTry() {
|
|
|
2099
2164
|
})), _testPromiseTry.apply(this, arguments);
|
|
2100
2165
|
}
|
|
2101
2166
|
function testRegExpDuplicateGroups() {
|
|
2102
|
-
var a = createSuite("RegExp Duplicate Named Capture Groups (ES2025)"), t = a.test, e = a.assert,
|
|
2167
|
+
var a = createSuite("RegExp Duplicate Named Capture Groups (ES2025)"), t = a.test, e = a.assert, i = a.getResults, n = !1;
|
|
2103
2168
|
try {
|
|
2104
2169
|
new RegExp("(?<a>x)|(?<a>y)"), n = !0;
|
|
2105
2170
|
} catch {
|
|
@@ -2145,8 +2210,8 @@ function testRegExpDuplicateGroups() {
|
|
|
2145
2210
|
}
|
|
2146
2211
|
var r = /* @__PURE__ */ _wrapRegExp(/([a-z]+)|(\d+)/g, {
|
|
2147
2212
|
word: [1, 2]
|
|
2148
|
-
}), s = _toConsumableArray("hello 42 world 7".matchAll(r)), u = s.map(function(
|
|
2149
|
-
return
|
|
2213
|
+
}), s = _toConsumableArray("hello 42 world 7".matchAll(r)), u = s.map(function(o) {
|
|
2214
|
+
return o.groups.word;
|
|
2150
2215
|
});
|
|
2151
2216
|
e(u.length === 4 && u[0] === "hello" && u[1] === "42", "matchAll 应正确提取所有命中词");
|
|
2152
2217
|
}), t("非命中分支的同名组值为 undefined", function() {
|
|
@@ -2158,10 +2223,10 @@ function testRegExpDuplicateGroups() {
|
|
|
2158
2223
|
a: [1, 2]
|
|
2159
2224
|
}), s = "bar".match(r);
|
|
2160
2225
|
e(s.groups.a === "bar", "应取命中分支的值");
|
|
2161
|
-
}),
|
|
2226
|
+
}), i();
|
|
2162
2227
|
}
|
|
2163
2228
|
function testUint8ArrayBase64Hex() {
|
|
2164
|
-
var a = createSuite("Uint8Array Base64/Hex (ES2025)"), t = a.test, e = a.assert,
|
|
2229
|
+
var a = createSuite("Uint8Array Base64/Hex (ES2025)"), t = a.test, e = a.assert, i = a.getResults, n = typeof Uint8Array.prototype.toBase64 == "function";
|
|
2165
2230
|
return t("环境支持检测", function() {
|
|
2166
2231
|
e(n, "环境不支持 Uint8Array Base64/Hex 方法");
|
|
2167
2232
|
}), t("toBase64() —— Uint8Array 转 Base64 字符串", function() {
|
|
@@ -2198,8 +2263,8 @@ function testUint8ArrayBase64Hex() {
|
|
|
2198
2263
|
return;
|
|
2199
2264
|
}
|
|
2200
2265
|
var r = new Uint8Array([1, 2, 3, 255, 0, 128]), s = Uint8Array.fromBase64(r.toBase64());
|
|
2201
|
-
e(r.length === s.length && r.every(function(u,
|
|
2202
|
-
return u === s[
|
|
2266
|
+
e(r.length === s.length && r.every(function(u, o) {
|
|
2267
|
+
return u === s[o];
|
|
2203
2268
|
}), "Base64 round-trip 应完全还原原始字节");
|
|
2204
2269
|
}), t("Hex round-trip(互转验证)", function() {
|
|
2205
2270
|
if (!n) {
|
|
@@ -2207,8 +2272,8 @@ function testUint8ArrayBase64Hex() {
|
|
|
2207
2272
|
return;
|
|
2208
2273
|
}
|
|
2209
2274
|
var r = new Uint8Array([0, 127, 128, 255]), s = Uint8Array.fromHex(r.toHex());
|
|
2210
|
-
e(r.length === s.length && r.every(function(u,
|
|
2211
|
-
return u === s[
|
|
2275
|
+
e(r.length === s.length && r.every(function(u, o) {
|
|
2276
|
+
return u === s[o];
|
|
2212
2277
|
}), "Hex round-trip 应完全还原原始字节");
|
|
2213
2278
|
}), t("空数组 toBase64 返回空字符串", function() {
|
|
2214
2279
|
if (!n) {
|
|
@@ -2233,10 +2298,10 @@ function testUint8ArrayBase64Hex() {
|
|
|
2233
2298
|
alphabet: "base64url"
|
|
2234
2299
|
});
|
|
2235
2300
|
e(u.indexOf("+") === -1 && u.indexOf("/") === -1, "URL-safe Base64 不应含 + 或 /"), e(s !== u || !s.includes("+") && !s.includes("/"), "URL-safe 与标准编码结果应存在差异(或均不含特殊字符)");
|
|
2236
|
-
}),
|
|
2301
|
+
}), i();
|
|
2237
2302
|
}
|
|
2238
2303
|
function testJsonParseSource() {
|
|
2239
|
-
var a = createSuite("JSON.parse Source Text Access (ES2025)"), t = a.test, e = a.assert,
|
|
2304
|
+
var a = createSuite("JSON.parse Source Text Access (ES2025)"), t = a.test, e = a.assert, i = a.getResults, n = !1;
|
|
2240
2305
|
try {
|
|
2241
2306
|
JSON.parse("1", function(r, s, u) {
|
|
2242
2307
|
return u && typeof u.source == "string" && (n = !0), s;
|
|
@@ -2251,8 +2316,8 @@ function testJsonParseSource() {
|
|
|
2251
2316
|
return;
|
|
2252
2317
|
}
|
|
2253
2318
|
var r = null;
|
|
2254
|
-
JSON.parse('"hello"', function(s, u,
|
|
2255
|
-
return s === "" && (r =
|
|
2319
|
+
JSON.parse('"hello"', function(s, u, o) {
|
|
2320
|
+
return s === "" && (r = o), u;
|
|
2256
2321
|
}), e(r !== null && typeof r.source == "string", "reviver 应收到含 source 属性的 context 对象");
|
|
2257
2322
|
}), t("context.source 为该值的原始 JSON 文本", function() {
|
|
2258
2323
|
if (!n) {
|
|
@@ -2260,16 +2325,16 @@ function testJsonParseSource() {
|
|
|
2260
2325
|
return;
|
|
2261
2326
|
}
|
|
2262
2327
|
var r = {};
|
|
2263
|
-
JSON.parse('{"a": 42, "b": "hello"}', function(s, u,
|
|
2264
|
-
return s !== "" && (r[s] =
|
|
2328
|
+
JSON.parse('{"a": 42, "b": "hello"}', function(s, u, o) {
|
|
2329
|
+
return s !== "" && (r[s] = o.source), u;
|
|
2265
2330
|
}), e(r.a === "42", '数字的 source 应为 "42",实际: "'.concat(r.a, '"')), e(r.b === '"hello"', `字符串的 source 应为 '"hello"',实际: "`.concat(r.b, '"'));
|
|
2266
2331
|
}), t("利用 source 精确解析超大整数(BigInt)", function() {
|
|
2267
2332
|
if (!n) {
|
|
2268
2333
|
e(!0, "(跳过)");
|
|
2269
2334
|
return;
|
|
2270
2335
|
}
|
|
2271
|
-
var r = "9007199254740993", s = JSON.parse('{"id":'.concat(r, "}"), function(u,
|
|
2272
|
-
return u === "" ?
|
|
2336
|
+
var r = "9007199254740993", s = JSON.parse('{"id":'.concat(r, "}"), function(u, o, c) {
|
|
2337
|
+
return u === "" ? o : /^\d+$/.test(c.source) ? BigInt(c.source) : o;
|
|
2273
2338
|
});
|
|
2274
2339
|
e(typeof s.id == "bigint", "超大整数应被转为 BigInt"), e(s.id === BigInt(r), "BigInt 值应精确等于 ".concat(r));
|
|
2275
2340
|
}), t("嵌套对象中每个值都能获取自己的 source", function() {
|
|
@@ -2278,8 +2343,8 @@ function testJsonParseSource() {
|
|
|
2278
2343
|
return;
|
|
2279
2344
|
}
|
|
2280
2345
|
var r = [];
|
|
2281
|
-
JSON.parse('{"x":1,"arr":[2,3]}', function(s, u,
|
|
2282
|
-
return s !== "" && r.push(
|
|
2346
|
+
JSON.parse('{"x":1,"arr":[2,3]}', function(s, u, o) {
|
|
2347
|
+
return s !== "" && r.push(o.source), u;
|
|
2283
2348
|
}), e(r.includes("1") && r.includes("2") && r.includes("3"), "嵌套结构中每个原始值都应能取到 source");
|
|
2284
2349
|
}), t("null / boolean 也有对应 source", function() {
|
|
2285
2350
|
if (!n) {
|
|
@@ -2287,13 +2352,13 @@ function testJsonParseSource() {
|
|
|
2287
2352
|
return;
|
|
2288
2353
|
}
|
|
2289
2354
|
var r = {};
|
|
2290
|
-
JSON.parse('{"a":null,"b":true,"c":false}', function(s, u,
|
|
2291
|
-
return s !== "" && (r[s] =
|
|
2355
|
+
JSON.parse('{"a":null,"b":true,"c":false}', function(s, u, o) {
|
|
2356
|
+
return s !== "" && (r[s] = o.source), u;
|
|
2292
2357
|
}), e(r.a === "null" && r.b === "true" && r.c === "false", "null/true/false 的 source 应为对应的原始文本");
|
|
2293
|
-
}),
|
|
2358
|
+
}), i();
|
|
2294
2359
|
}
|
|
2295
2360
|
function testErrorIsError() {
|
|
2296
|
-
var a = createSuite("Error.isError (ES2025)"), t = a.test, e = a.assert,
|
|
2361
|
+
var a = createSuite("Error.isError (ES2025)"), t = a.test, e = a.assert, i = a.getResults, n = typeof Error.isError == "function";
|
|
2297
2362
|
return t("环境支持检测", function() {
|
|
2298
2363
|
e(n, "环境不支持 Error.isError");
|
|
2299
2364
|
}), t("原生 Error 实例返回 true", function() {
|
|
@@ -2314,9 +2379,9 @@ function testErrorIsError() {
|
|
|
2314
2379
|
return;
|
|
2315
2380
|
}
|
|
2316
2381
|
var r = /* @__PURE__ */ function(s) {
|
|
2317
|
-
function u(
|
|
2382
|
+
function u(o) {
|
|
2318
2383
|
var c;
|
|
2319
|
-
return _classCallCheck(this, u), c = _callSuper(this, u, [
|
|
2384
|
+
return _classCallCheck(this, u), c = _callSuper(this, u, [o]), c.name = "AppError", c;
|
|
2320
2385
|
}
|
|
2321
2386
|
return _inherits(u, s), _createClass(u);
|
|
2322
2387
|
}(/* @__PURE__ */ _wrapNativeSuper(Error));
|
|
@@ -2361,10 +2426,10 @@ function testErrorIsError() {
|
|
|
2361
2426
|
s = u;
|
|
2362
2427
|
}
|
|
2363
2428
|
e(Error.isError(s) === !0, "try/catch 捕获的 Error 应识别为 true"), e(Error.isError("string rejection") === !1, "字符串 rejection 应识别为 false");
|
|
2364
|
-
}),
|
|
2429
|
+
}), i();
|
|
2365
2430
|
}
|
|
2366
2431
|
function testFloat16Array() {
|
|
2367
|
-
var a = createSuite("Float16Array (ES2025)"), t = a.test, e = a.assert,
|
|
2432
|
+
var a = createSuite("Float16Array (ES2025)"), t = a.test, e = a.assert, i = a.getResults, n = typeof Float16Array < "u";
|
|
2368
2433
|
return t("环境支持检测", function() {
|
|
2369
2434
|
e(n, "环境不支持 Float16Array");
|
|
2370
2435
|
}), t("Float16Array 可正常创建", function() {
|
|
@@ -2425,10 +2490,10 @@ function testFloat16Array() {
|
|
|
2425
2490
|
}
|
|
2426
2491
|
var r = 100, s = new Float16Array(r), u = new Float32Array(r);
|
|
2427
2492
|
e(s.byteLength === u.byteLength / 2, "Float16Array 字节长度应是 Float32Array 的一半");
|
|
2428
|
-
}),
|
|
2493
|
+
}), i();
|
|
2429
2494
|
}
|
|
2430
2495
|
function testMathSumPrecise() {
|
|
2431
|
-
var a = createSuite("Math.sumPrecise() (ES2026)"), t = a.test, e = a.assert,
|
|
2496
|
+
var a = createSuite("Math.sumPrecise() (ES2026)"), t = a.test, e = a.assert, i = a.getResults, n = typeof Math.sumPrecise == "function";
|
|
2432
2497
|
return t("环境支持检测", function() {
|
|
2433
2498
|
e(n, "环境不支持 Math.sumPrecise");
|
|
2434
2499
|
}), t("基本求和 —— 整数", function() {
|
|
@@ -2442,8 +2507,8 @@ function testMathSumPrecise() {
|
|
|
2442
2507
|
e(!0, "(跳过)");
|
|
2443
2508
|
return;
|
|
2444
2509
|
}
|
|
2445
|
-
var r = [0.1, 0.2, 0.3].reduce(function(u,
|
|
2446
|
-
return u +
|
|
2510
|
+
var r = [0.1, 0.2, 0.3].reduce(function(u, o) {
|
|
2511
|
+
return u + o;
|
|
2447
2512
|
}), s = Math.sumPrecise([0.1, 0.2, 0.3]);
|
|
2448
2513
|
e(r !== 0.6, "普通 reduce 应存在浮点误差(验证前提)"), e(s === 0.6, "Math.sumPrecise 应精确返回 0.6");
|
|
2449
2514
|
}), t("大量小数精确求和", function() {
|
|
@@ -2476,8 +2541,8 @@ function testMathSumPrecise() {
|
|
|
2476
2541
|
}
|
|
2477
2542
|
}, r);
|
|
2478
2543
|
}
|
|
2479
|
-
var
|
|
2480
|
-
e(
|
|
2544
|
+
var o = Math.sumPrecise(u());
|
|
2545
|
+
e(o === 6, "支持 Generator 可迭代对象");
|
|
2481
2546
|
}), t("特殊值处理", function() {
|
|
2482
2547
|
if (!n) {
|
|
2483
2548
|
e(!0, "(跳过)");
|
|
@@ -2496,10 +2561,10 @@ function testMathSumPrecise() {
|
|
|
2496
2561
|
r = s instanceof TypeError;
|
|
2497
2562
|
}
|
|
2498
2563
|
e(r, "非数值元素应抛出 TypeError");
|
|
2499
|
-
}),
|
|
2564
|
+
}), i();
|
|
2500
2565
|
}
|
|
2501
2566
|
function testRegExpEscape() {
|
|
2502
|
-
var a = createSuite("RegExp.escape() (ES2026)"), t = a.test, e = a.assert,
|
|
2567
|
+
var a = createSuite("RegExp.escape() (ES2026)"), t = a.test, e = a.assert, i = a.getResults, n = typeof RegExp.escape == "function";
|
|
2503
2568
|
return t("环境支持检测", function() {
|
|
2504
2569
|
e(n, "环境不支持 RegExp.escape");
|
|
2505
2570
|
}), t("转义正则特殊字符", function() {
|
|
@@ -2541,38 +2606,45 @@ function testRegExpEscape() {
|
|
|
2541
2606
|
e(!0, "(跳过)");
|
|
2542
2607
|
return;
|
|
2543
2608
|
}
|
|
2544
|
-
var r = "商品价格 $10.00,原价 $20.00", s = "$10.00", u = new RegExp(RegExp.escape(s), "g"),
|
|
2545
|
-
e(
|
|
2546
|
-
}),
|
|
2609
|
+
var r = "商品价格 $10.00,原价 $20.00", s = "$10.00", u = new RegExp(RegExp.escape(s), "g"), o = (r.match(u) || []).length;
|
|
2610
|
+
e(o === 1, "含特殊字符的关键词应精确匹配 1 次");
|
|
2611
|
+
}), i();
|
|
2547
2612
|
}
|
|
2548
2613
|
function testExplicitResourceManagement() {
|
|
2549
2614
|
return _testExplicitResourceManagement.apply(this, arguments);
|
|
2550
2615
|
}
|
|
2551
2616
|
function _testExplicitResourceManagement() {
|
|
2552
2617
|
return _testExplicitResourceManagement = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function a() {
|
|
2553
|
-
var t, e,
|
|
2618
|
+
var t, e, i, n, r;
|
|
2554
2619
|
return _regenerator().w(function(s) {
|
|
2555
2620
|
for (; ; )
|
|
2556
2621
|
switch (s.n) {
|
|
2557
2622
|
case 0:
|
|
2558
|
-
return t = createSuite("Explicit Resource Management (ES2026)"), e = t.test,
|
|
2623
|
+
return t = createSuite("Explicit Resource Management (ES2026)"), e = t.test, i = t.assert, n = t.getResults, r = function() {
|
|
2559
2624
|
try {
|
|
2560
|
-
|
|
2625
|
+
try {
|
|
2626
|
+
var u = _usingCtx(), o = u.u("cx");
|
|
2627
|
+
return new Function("Symbol", `
|
|
2561
2628
|
const r = { [Symbol.dispose]() {} }
|
|
2562
2629
|
{ using x = r }
|
|
2563
2630
|
`)(Symbol), !0;
|
|
2631
|
+
} catch (c) {
|
|
2632
|
+
u.e = c;
|
|
2633
|
+
} finally {
|
|
2634
|
+
u.d();
|
|
2635
|
+
}
|
|
2564
2636
|
} catch {
|
|
2565
2637
|
return !1;
|
|
2566
2638
|
}
|
|
2567
2639
|
}(), e("环境支持检测", function() {
|
|
2568
|
-
|
|
2640
|
+
i(r, "环境不支持 using / await using 语法");
|
|
2569
2641
|
}), e("Symbol.dispose 已定义", function() {
|
|
2570
|
-
|
|
2642
|
+
i(_typeof(Symbol.dispose) === "symbol", "Symbol.dispose 应是 symbol 类型");
|
|
2571
2643
|
}), e("Symbol.asyncDispose 已定义", function() {
|
|
2572
|
-
|
|
2644
|
+
i(_typeof(Symbol.asyncDispose) === "symbol", "Symbol.asyncDispose 应是 symbol 类型");
|
|
2573
2645
|
}), e("using —— 块退出时自动调用 Symbol.dispose", function() {
|
|
2574
2646
|
if (!r) {
|
|
2575
|
-
|
|
2647
|
+
i(!0, "(跳过:环境不支持 using 语法)");
|
|
2576
2648
|
return;
|
|
2577
2649
|
}
|
|
2578
2650
|
var u = [];
|
|
@@ -2584,10 +2656,10 @@ function _testExplicitResourceManagement() {
|
|
|
2584
2656
|
log.push('in-block')
|
|
2585
2657
|
}
|
|
2586
2658
|
log.push('after-block')
|
|
2587
|
-
`)(u, Symbol),
|
|
2659
|
+
`)(u, Symbol), i(u[0] === "in-block", "块内代码应正常执行"), i(u[1] === "disposed", "块退出时应自动调用 dispose"), i(u[2] === "after-block", "dispose 之后块后代码才继续执行");
|
|
2588
2660
|
}), e("using —— 异常时也会调用 dispose(保证清理)", function() {
|
|
2589
2661
|
if (!r) {
|
|
2590
|
-
|
|
2662
|
+
i(!0, "(跳过)");
|
|
2591
2663
|
return;
|
|
2592
2664
|
}
|
|
2593
2665
|
var u = [];
|
|
@@ -2600,10 +2672,10 @@ function _testExplicitResourceManagement() {
|
|
|
2600
2672
|
`)(u, Symbol);
|
|
2601
2673
|
} catch {
|
|
2602
2674
|
}
|
|
2603
|
-
|
|
2675
|
+
i(u[0] === "cleanup", "即使抛出异常也应执行 dispose 清理");
|
|
2604
2676
|
}), e("多个 using 资源按 LIFO 顺序释放", function() {
|
|
2605
2677
|
if (!r) {
|
|
2606
|
-
|
|
2678
|
+
i(!0, "(跳过)");
|
|
2607
2679
|
return;
|
|
2608
2680
|
}
|
|
2609
2681
|
var u = [];
|
|
@@ -2613,9 +2685,9 @@ function _testExplicitResourceManagement() {
|
|
|
2613
2685
|
using b = { [Symbol.dispose]() { order.push('B') } }
|
|
2614
2686
|
using c = { [Symbol.dispose]() { order.push('C') } }
|
|
2615
2687
|
}
|
|
2616
|
-
`)(u, Symbol),
|
|
2688
|
+
`)(u, Symbol), i(u.join(",") === "C,B,A", "多资源应按 LIFO(后进先出)顺序释放");
|
|
2617
2689
|
}), s.n = 1, e("await using —— 异步 dispose", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
2618
|
-
var
|
|
2690
|
+
var o, c;
|
|
2619
2691
|
return _regenerator().w(function(f) {
|
|
2620
2692
|
for (; ; )
|
|
2621
2693
|
switch (f.n) {
|
|
@@ -2624,9 +2696,9 @@ function _testExplicitResourceManagement() {
|
|
|
2624
2696
|
f.n = 1;
|
|
2625
2697
|
break;
|
|
2626
2698
|
}
|
|
2627
|
-
return
|
|
2699
|
+
return i(!0, "(跳过)"), f.a(2);
|
|
2628
2700
|
case 1:
|
|
2629
|
-
return
|
|
2701
|
+
return o = [], c = new Function("log", "Symbol", `
|
|
2630
2702
|
return (async () => {
|
|
2631
2703
|
{
|
|
2632
2704
|
await using r = {
|
|
@@ -2639,9 +2711,9 @@ function _testExplicitResourceManagement() {
|
|
|
2639
2711
|
}
|
|
2640
2712
|
log.push('after-block')
|
|
2641
2713
|
})()
|
|
2642
|
-
`), f.n = 2, c(
|
|
2714
|
+
`), f.n = 2, c(o, Symbol);
|
|
2643
2715
|
case 2:
|
|
2644
|
-
o
|
|
2716
|
+
i(o[0] === "in-block", "异步块内应正常执行"), i(o[1] === "async-disposed", "await using 应等待异步 dispose 完成"), i(o[2] === "after-block", "dispose 之后才继续执行块后代码");
|
|
2645
2717
|
case 3:
|
|
2646
2718
|
return f.a(2);
|
|
2647
2719
|
}
|
|
@@ -2650,22 +2722,22 @@ function _testExplicitResourceManagement() {
|
|
|
2650
2722
|
case 1:
|
|
2651
2723
|
return e("DisposableStack —— 手动管理资源栈", function() {
|
|
2652
2724
|
if (typeof DisposableStack > "u") {
|
|
2653
|
-
|
|
2725
|
+
i(!0, "(跳过:环境不支持 DisposableStack)");
|
|
2654
2726
|
return;
|
|
2655
2727
|
}
|
|
2656
|
-
var u = [],
|
|
2657
|
-
|
|
2728
|
+
var u = [], o = new DisposableStack();
|
|
2729
|
+
o.defer(function() {
|
|
2658
2730
|
return u.push("deferred-1");
|
|
2659
|
-
}),
|
|
2731
|
+
}), o.defer(function() {
|
|
2660
2732
|
return u.push("deferred-2");
|
|
2661
|
-
}),
|
|
2733
|
+
}), o.dispose(), i(u.join(",") === "deferred-2,deferred-1", "DisposableStack 应按 LIFO 执行");
|
|
2662
2734
|
}), s.a(2, n());
|
|
2663
2735
|
}
|
|
2664
2736
|
}, a);
|
|
2665
2737
|
})), _testExplicitResourceManagement.apply(this, arguments);
|
|
2666
2738
|
}
|
|
2667
2739
|
function testAtomicsPause() {
|
|
2668
|
-
var a = createSuite("Atomics.pause() (ES2026)"), t = a.test, e = a.assert,
|
|
2740
|
+
var a = createSuite("Atomics.pause() (ES2026)"), t = a.test, e = a.assert, i = a.getResults, n = typeof Atomics.pause == "function";
|
|
2669
2741
|
return t("环境支持检测", function() {
|
|
2670
2742
|
e(n, "环境不支持 Atomics.pause");
|
|
2671
2743
|
}), t("Atomics.pause 函数存在", function() {
|
|
@@ -2723,31 +2795,31 @@ function testAtomicsPause() {
|
|
|
2723
2795
|
}
|
|
2724
2796
|
var r = new SharedArrayBuffer(4), s = new Int32Array(r);
|
|
2725
2797
|
s[0] = 1;
|
|
2726
|
-
for (var u = 0,
|
|
2798
|
+
for (var u = 0, o = 5; Atomics.load(s, 0) !== 0 && u < o; )
|
|
2727
2799
|
Atomics.pause(u), u++, u === 3 && Atomics.store(s, 0, 0);
|
|
2728
2800
|
e(Atomics.load(s, 0) === 0, "自旋等待后标志位应变为 0(锁释放)"), e(u === 3, "应在第 3 次迭代时检测到锁释放");
|
|
2729
|
-
}),
|
|
2801
|
+
}), i();
|
|
2730
2802
|
}
|
|
2731
2803
|
function testImportAttributes() {
|
|
2732
2804
|
return _testImportAttributes.apply(this, arguments);
|
|
2733
2805
|
}
|
|
2734
2806
|
function _testImportAttributes() {
|
|
2735
2807
|
return _testImportAttributes = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function a() {
|
|
2736
|
-
var t, e,
|
|
2808
|
+
var t, e, i, n, r;
|
|
2737
2809
|
return _regenerator().w(function(s) {
|
|
2738
2810
|
for (; ; )
|
|
2739
2811
|
switch (s.n) {
|
|
2740
2812
|
case 0:
|
|
2741
|
-
return t = createSuite("Import Attributes (ES2026)"), e = t.test,
|
|
2813
|
+
return t = createSuite("Import Attributes (ES2026)"), e = t.test, i = t.assert, n = t.getResults, r = function() {
|
|
2742
2814
|
try {
|
|
2743
2815
|
return new Function("import('data:text/javascript,export default 1', { with: { type: 'javascript' } })"), !0;
|
|
2744
2816
|
} catch {
|
|
2745
2817
|
return !1;
|
|
2746
2818
|
}
|
|
2747
2819
|
}(), e("环境支持检测", function() {
|
|
2748
|
-
|
|
2820
|
+
i(r, "环境不支持 import with 语法");
|
|
2749
2821
|
}), s.n = 1, e("动态 import() 支持 with 选项对象", /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function u() {
|
|
2750
|
-
var
|
|
2822
|
+
var o, c, f;
|
|
2751
2823
|
return _regenerator().w(function(l) {
|
|
2752
2824
|
for (; ; )
|
|
2753
2825
|
switch (l.p = l.n) {
|
|
@@ -2756,16 +2828,16 @@ function _testImportAttributes() {
|
|
|
2756
2828
|
l.n = 1;
|
|
2757
2829
|
break;
|
|
2758
2830
|
}
|
|
2759
|
-
return
|
|
2831
|
+
return i(!0, "(跳过:环境不支持 import with 语法)"), l.a(2);
|
|
2760
2832
|
case 1:
|
|
2761
|
-
return
|
|
2833
|
+
return o = null, l.p = 2, c = new Function('return import("data:text/javascript,export default \\"hello\\"", { with: { type: "javascript" } })'), l.n = 3, c();
|
|
2762
2834
|
case 3:
|
|
2763
|
-
f = l.v,
|
|
2835
|
+
f = l.v, o = f.default, l.n = 5;
|
|
2764
2836
|
break;
|
|
2765
2837
|
case 4:
|
|
2766
|
-
l.p = 4, l.v,
|
|
2838
|
+
l.p = 4, l.v, o = "syntax-ok";
|
|
2767
2839
|
case 5:
|
|
2768
|
-
o
|
|
2840
|
+
i(o === "hello" || o === "syntax-ok", "import with 语法应被环境支持");
|
|
2769
2841
|
case 6:
|
|
2770
2842
|
return l.a(2);
|
|
2771
2843
|
}
|
|
@@ -2778,7 +2850,7 @@ function _testImportAttributes() {
|
|
|
2778
2850
|
type: "json"
|
|
2779
2851
|
}
|
|
2780
2852
|
};
|
|
2781
|
-
|
|
2853
|
+
i(typeof u.with.type == "string", "type 属性应为字符串"), i(u.with.type === "json", "json type 应正确设置");
|
|
2782
2854
|
}), e("import() 的第二个参数结构", function() {
|
|
2783
2855
|
var u = [{
|
|
2784
2856
|
with: {
|
|
@@ -2793,14 +2865,14 @@ function _testImportAttributes() {
|
|
|
2793
2865
|
type: "javascript"
|
|
2794
2866
|
}
|
|
2795
2867
|
}];
|
|
2796
|
-
u.forEach(function(
|
|
2797
|
-
o
|
|
2798
|
-
}),
|
|
2868
|
+
u.forEach(function(o) {
|
|
2869
|
+
i(o.with !== void 0, "options.with 应存在"), i(typeof o.with.type == "string", "type 应为字符串");
|
|
2870
|
+
}), i(!0, "import() 选项结构验证通过");
|
|
2799
2871
|
}), e("JSON 模块导入属性防止 MIME 混淆(原理说明)", function() {
|
|
2800
2872
|
var u = !0;
|
|
2801
|
-
|
|
2873
|
+
i(u, 'JSON 模块导入应声明 type: "json" 防止 MIME 混淆攻击');
|
|
2802
2874
|
}), e("import with 仅传递元信息,不影响模块标识符", function() {
|
|
2803
|
-
var u = "./data.json",
|
|
2875
|
+
var u = "./data.json", o = {
|
|
2804
2876
|
with: {
|
|
2805
2877
|
type: "json"
|
|
2806
2878
|
}
|
|
@@ -2809,7 +2881,7 @@ function _testImportAttributes() {
|
|
|
2809
2881
|
type: "json"
|
|
2810
2882
|
}
|
|
2811
2883
|
};
|
|
2812
|
-
|
|
2884
|
+
i(u === "./data.json", "模块说明符不应被 with 属性修改"), i(o.with.type === c.with.type, "相同 type 的 options 应等价");
|
|
2813
2885
|
}), s.a(2, n());
|
|
2814
2886
|
}
|
|
2815
2887
|
}, a);
|
|
@@ -2932,32 +3004,32 @@ function runSuites(a) {
|
|
|
2932
3004
|
}
|
|
2933
3005
|
function _runSuites() {
|
|
2934
3006
|
return _runSuites = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function a(t) {
|
|
2935
|
-
var e,
|
|
2936
|
-
return _regenerator().w(function(
|
|
3007
|
+
var e, i, n, r, s, u;
|
|
3008
|
+
return _regenerator().w(function(o) {
|
|
2937
3009
|
for (; ; )
|
|
2938
|
-
switch (
|
|
3010
|
+
switch (o.p = o.n) {
|
|
2939
3011
|
case 0:
|
|
2940
|
-
e = [],
|
|
3012
|
+
e = [], i = _createForOfIteratorHelper(t), o.p = 1, i.s();
|
|
2941
3013
|
case 2:
|
|
2942
|
-
if ((n =
|
|
2943
|
-
|
|
3014
|
+
if ((n = i.n()).done) {
|
|
3015
|
+
o.n = 5;
|
|
2944
3016
|
break;
|
|
2945
3017
|
}
|
|
2946
|
-
return r = n.value,
|
|
3018
|
+
return r = n.value, o.n = 3, r.fn();
|
|
2947
3019
|
case 3:
|
|
2948
|
-
s =
|
|
3020
|
+
s = o.v, e.push.apply(e, _toConsumableArray(s));
|
|
2949
3021
|
case 4:
|
|
2950
|
-
|
|
3022
|
+
o.n = 2;
|
|
2951
3023
|
break;
|
|
2952
3024
|
case 5:
|
|
2953
|
-
|
|
3025
|
+
o.n = 7;
|
|
2954
3026
|
break;
|
|
2955
3027
|
case 6:
|
|
2956
|
-
|
|
3028
|
+
o.p = 6, u = o.v, i.e(u);
|
|
2957
3029
|
case 7:
|
|
2958
|
-
return
|
|
3030
|
+
return o.p = 7, i.f(), o.f(7);
|
|
2959
3031
|
case 8:
|
|
2960
|
-
return
|
|
3032
|
+
return o.a(2, e);
|
|
2961
3033
|
}
|
|
2962
3034
|
}, a, null, [[1, 6, 7, 8]]);
|
|
2963
3035
|
})), _runSuites.apply(this, arguments);
|
|
@@ -3037,7 +3109,7 @@ function runAndPrint() {
|
|
|
3037
3109
|
}
|
|
3038
3110
|
function _runAndPrint() {
|
|
3039
3111
|
return _runAndPrint = _asyncToGenerator(/* @__PURE__ */ _regenerator().m(function a() {
|
|
3040
|
-
var t, e,
|
|
3112
|
+
var t, e, i, n, r, s;
|
|
3041
3113
|
return _regenerator().w(function(u) {
|
|
3042
3114
|
for (; ; )
|
|
3043
3115
|
switch (u.n) {
|
|
@@ -3048,7 +3120,7 @@ function _runAndPrint() {
|
|
|
3048
3120
|
u.n = 4;
|
|
3049
3121
|
break;
|
|
3050
3122
|
}
|
|
3051
|
-
return
|
|
3123
|
+
return i = _slicedToArray(e[t], 2), n = i[0], r = i[1], console.log(`
|
|
3052
3124
|
=== `.concat(n, ` 特性测试 ===
|
|
3053
3125
|
`)), s = printResults, u.n = 2, r();
|
|
3054
3126
|
case 2:
|