@vitest/browser 4.0.0-beta.11 → 4.0.0-beta.13
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/client/.vite/manifest.json +6 -6
- package/dist/client/__vitest__/assets/index-C15NF4dG.js +53 -0
- package/dist/client/__vitest__/assets/index-CjTcNCIc.css +1 -0
- package/dist/client/__vitest__/index.html +2 -2
- package/dist/client/__vitest_browser__/{orchestrator-DOxlOAkk.js → orchestrator-Pdu7HCGX.js} +55 -38
- package/dist/client/__vitest_browser__/{tester-B7fynsGK.js → tester-DYNLfPFH.js} +135 -92
- package/dist/client/__vitest_browser__/{utils-CPmDBIKG.js → utils-uxqdqUz8.js} +48 -20
- package/dist/client/orchestrator.html +2 -2
- package/dist/client/tester/tester.html +2 -2
- package/dist/expect-element.js +10 -10
- package/dist/index-BPDFwkoW.js +1 -0
- package/dist/index.js +131 -12
- package/dist/locators/index.js +1 -1
- package/dist/locators/playwright.js +1 -1
- package/dist/locators/preview.js +1 -1
- package/dist/locators/webdriverio.js +1 -1
- package/dist/providers/playwright.d.ts +4 -2
- package/dist/providers/playwright.js +24 -3
- package/dist/providers/preview.js +1 -0
- package/dist/providers/webdriverio.d.ts +3 -2
- package/dist/providers/webdriverio.js +35 -0
- package/dist/public-utils-B6exS8fl.js +6 -0
- package/dist/utils.js +1 -1
- package/matchers.d.ts +1 -1
- package/package.json +9 -9
- package/dist/client/__vitest__/assets/index-CCvbyxW7.css +0 -1
- package/dist/client/__vitest__/assets/index-CYIziQD6.js +0 -53
- package/dist/index-DDlvjJVO.js +0 -1
- package/dist/public-utils-Kx5DUGWa.js +0 -6
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as resolve, m as moduleRunner, d as getWorkerState, g as getBrowserState, e as getTestName, a as getConfig } from "./utils-uxqdqUz8.js";
|
|
2
2
|
import { onCancel, globalChannel, channel, client } from "@vitest/browser/client";
|
|
3
3
|
import { userEvent, page, server } from "@vitest/browser/context";
|
|
4
4
|
import { getSafeTimers, DecodedMap as DecodedMap$1, getOriginalPosition as getOriginalPosition$1, loadDiffConfig, loadSnapshotSerializers, takeCoverageInsideWorker, stringify, format, setupCommonEnv, startCoverageInsideWorker, stopCoverageInsideWorker, startTests, collectTests, SpyModule } from "vitest/internal/browser";
|
|
@@ -11,63 +11,43 @@ const seen = {};
|
|
|
11
11
|
const __vitePreload = function preload(baseModule, deps, importerUrl) {
|
|
12
12
|
let promise = Promise.resolve();
|
|
13
13
|
if (deps && deps.length > 0) {
|
|
14
|
-
let
|
|
15
|
-
return Promise.all(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
);
|
|
14
|
+
let allSettled = function(promises$2) {
|
|
15
|
+
return Promise.all(promises$2.map((p) => Promise.resolve(p).then((value$1) => ({
|
|
16
|
+
status: "fulfilled",
|
|
17
|
+
value: value$1
|
|
18
|
+
}), (reason) => ({
|
|
19
|
+
status: "rejected",
|
|
20
|
+
reason
|
|
21
|
+
}))));
|
|
23
22
|
};
|
|
24
23
|
document.getElementsByTagName("link");
|
|
25
|
-
const cspNonceMeta = document.querySelector(
|
|
26
|
-
"meta[property=csp-nonce]"
|
|
27
|
-
);
|
|
24
|
+
const cspNonceMeta = document.querySelector("meta[property=csp-nonce]");
|
|
28
25
|
const cspNonce = (cspNonceMeta == null ? void 0 : cspNonceMeta.nonce) || (cspNonceMeta == null ? void 0 : cspNonceMeta.getAttribute("nonce"));
|
|
29
|
-
promise =
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
link.
|
|
45
|
-
link.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
document.head.appendChild(link);
|
|
50
|
-
if (isCss) {
|
|
51
|
-
return new Promise((res, rej) => {
|
|
52
|
-
link.addEventListener("load", res);
|
|
53
|
-
link.addEventListener(
|
|
54
|
-
"error",
|
|
55
|
-
() => rej(new Error(`Unable to preload CSS for ${dep}`))
|
|
56
|
-
);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
);
|
|
26
|
+
promise = allSettled(deps.map((dep) => {
|
|
27
|
+
dep = assetsURL(dep);
|
|
28
|
+
if (dep in seen) return;
|
|
29
|
+
seen[dep] = true;
|
|
30
|
+
const isCss = dep.endsWith(".css");
|
|
31
|
+
const cssSelector = isCss ? '[rel="stylesheet"]' : "";
|
|
32
|
+
if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) return;
|
|
33
|
+
const link = document.createElement("link");
|
|
34
|
+
link.rel = isCss ? "stylesheet" : scriptRel;
|
|
35
|
+
if (!isCss) link.as = "script";
|
|
36
|
+
link.crossOrigin = "";
|
|
37
|
+
link.href = dep;
|
|
38
|
+
if (cspNonce) link.setAttribute("nonce", cspNonce);
|
|
39
|
+
document.head.appendChild(link);
|
|
40
|
+
if (isCss) return new Promise((res, rej) => {
|
|
41
|
+
link.addEventListener("load", res);
|
|
42
|
+
link.addEventListener("error", () => rej(/* @__PURE__ */ new Error(`Unable to preload CSS for ${dep}`)));
|
|
43
|
+
});
|
|
44
|
+
}));
|
|
61
45
|
}
|
|
62
|
-
function handlePreloadError(err) {
|
|
63
|
-
const e = new Event("vite:preloadError", {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
e.
|
|
67
|
-
window.dispatchEvent(e);
|
|
68
|
-
if (!e.defaultPrevented) {
|
|
69
|
-
throw err;
|
|
70
|
-
}
|
|
46
|
+
function handlePreloadError(err$2) {
|
|
47
|
+
const e$1 = new Event("vite:preloadError", { cancelable: true });
|
|
48
|
+
e$1.payload = err$2;
|
|
49
|
+
window.dispatchEvent(e$1);
|
|
50
|
+
if (!e$1.defaultPrevented) throw err$2;
|
|
71
51
|
}
|
|
72
52
|
return promise.then((res) => {
|
|
73
53
|
for (const item of res || []) {
|
|
@@ -280,20 +260,10 @@ function requireResolveUri_umd() {
|
|
|
280
260
|
(function(module, exports) {
|
|
281
261
|
(function(global, factory) {
|
|
282
262
|
module.exports = factory();
|
|
283
|
-
})(resolveUri_umd, function() {
|
|
263
|
+
})(resolveUri_umd, (function() {
|
|
284
264
|
const schemeRegex = /^[\w+.-]+:\/\//;
|
|
285
265
|
const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/;
|
|
286
266
|
const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;
|
|
287
|
-
var UrlType;
|
|
288
|
-
(function(UrlType2) {
|
|
289
|
-
UrlType2[UrlType2["Empty"] = 1] = "Empty";
|
|
290
|
-
UrlType2[UrlType2["Hash"] = 2] = "Hash";
|
|
291
|
-
UrlType2[UrlType2["Query"] = 3] = "Query";
|
|
292
|
-
UrlType2[UrlType2["RelativePath"] = 4] = "RelativePath";
|
|
293
|
-
UrlType2[UrlType2["AbsolutePath"] = 5] = "AbsolutePath";
|
|
294
|
-
UrlType2[UrlType2["SchemeRelative"] = 6] = "SchemeRelative";
|
|
295
|
-
UrlType2[UrlType2["Absolute"] = 7] = "Absolute";
|
|
296
|
-
})(UrlType || (UrlType = {}));
|
|
297
267
|
function isAbsoluteUrl(input) {
|
|
298
268
|
return schemeRegex.test(input);
|
|
299
269
|
}
|
|
@@ -327,21 +297,21 @@ function requireResolveUri_umd() {
|
|
|
327
297
|
path,
|
|
328
298
|
query,
|
|
329
299
|
hash,
|
|
330
|
-
type:
|
|
300
|
+
type: 7
|
|
331
301
|
};
|
|
332
302
|
}
|
|
333
303
|
function parseUrl(input) {
|
|
334
304
|
if (isSchemeRelativeUrl(input)) {
|
|
335
305
|
const url3 = parseAbsoluteUrl("http:" + input);
|
|
336
306
|
url3.scheme = "";
|
|
337
|
-
url3.type =
|
|
307
|
+
url3.type = 6;
|
|
338
308
|
return url3;
|
|
339
309
|
}
|
|
340
310
|
if (isAbsolutePath(input)) {
|
|
341
311
|
const url3 = parseAbsoluteUrl("http://foo.com" + input);
|
|
342
312
|
url3.scheme = "";
|
|
343
313
|
url3.host = "";
|
|
344
|
-
url3.type =
|
|
314
|
+
url3.type = 5;
|
|
345
315
|
return url3;
|
|
346
316
|
}
|
|
347
317
|
if (isFileUrl(input))
|
|
@@ -351,7 +321,7 @@ function requireResolveUri_umd() {
|
|
|
351
321
|
const url2 = parseAbsoluteUrl("http://foo.com/" + input);
|
|
352
322
|
url2.scheme = "";
|
|
353
323
|
url2.host = "";
|
|
354
|
-
url2.type = input ? input.startsWith("?") ?
|
|
324
|
+
url2.type = input ? input.startsWith("?") ? 3 : input.startsWith("#") ? 2 : 4 : 1;
|
|
355
325
|
return url2;
|
|
356
326
|
}
|
|
357
327
|
function stripPathFilename(path) {
|
|
@@ -369,7 +339,7 @@ function requireResolveUri_umd() {
|
|
|
369
339
|
}
|
|
370
340
|
}
|
|
371
341
|
function normalizePath(url2, type) {
|
|
372
|
-
const rel = type <=
|
|
342
|
+
const rel = type <= 4;
|
|
373
343
|
const pieces = url2.path.split("/");
|
|
374
344
|
let pointer = 1;
|
|
375
345
|
let positive = 0;
|
|
@@ -410,26 +380,26 @@ function requireResolveUri_umd() {
|
|
|
410
380
|
return "";
|
|
411
381
|
const url2 = parseUrl(input);
|
|
412
382
|
let inputType = url2.type;
|
|
413
|
-
if (base && inputType !==
|
|
383
|
+
if (base && inputType !== 7) {
|
|
414
384
|
const baseUrl = parseUrl(base);
|
|
415
385
|
const baseType = baseUrl.type;
|
|
416
386
|
switch (inputType) {
|
|
417
|
-
case
|
|
387
|
+
case 1:
|
|
418
388
|
url2.hash = baseUrl.hash;
|
|
419
389
|
// fall through
|
|
420
|
-
case
|
|
390
|
+
case 2:
|
|
421
391
|
url2.query = baseUrl.query;
|
|
422
392
|
// fall through
|
|
423
|
-
case
|
|
424
|
-
case
|
|
393
|
+
case 3:
|
|
394
|
+
case 4:
|
|
425
395
|
mergePaths(url2, baseUrl);
|
|
426
396
|
// fall through
|
|
427
|
-
case
|
|
397
|
+
case 5:
|
|
428
398
|
url2.user = baseUrl.user;
|
|
429
399
|
url2.host = baseUrl.host;
|
|
430
400
|
url2.port = baseUrl.port;
|
|
431
401
|
// fall through
|
|
432
|
-
case
|
|
402
|
+
case 6:
|
|
433
403
|
url2.scheme = baseUrl.scheme;
|
|
434
404
|
}
|
|
435
405
|
if (baseType > inputType)
|
|
@@ -440,10 +410,10 @@ function requireResolveUri_umd() {
|
|
|
440
410
|
switch (inputType) {
|
|
441
411
|
// This is impossible, because of the empty checks at the start of the function.
|
|
442
412
|
// case UrlType.Empty:
|
|
443
|
-
case
|
|
444
|
-
case
|
|
413
|
+
case 2:
|
|
414
|
+
case 3:
|
|
445
415
|
return queryHash;
|
|
446
|
-
case
|
|
416
|
+
case 4: {
|
|
447
417
|
const path = url2.path.slice(1);
|
|
448
418
|
if (!path)
|
|
449
419
|
return queryHash || ".";
|
|
@@ -452,14 +422,14 @@ function requireResolveUri_umd() {
|
|
|
452
422
|
}
|
|
453
423
|
return path + queryHash;
|
|
454
424
|
}
|
|
455
|
-
case
|
|
425
|
+
case 5:
|
|
456
426
|
return url2.path + queryHash;
|
|
457
427
|
default:
|
|
458
428
|
return url2.scheme + "//" + url2.user + url2.host + url2.port + url2.path + queryHash;
|
|
459
429
|
}
|
|
460
430
|
}
|
|
461
431
|
return resolve2;
|
|
462
|
-
});
|
|
432
|
+
}));
|
|
463
433
|
})(resolveUri_umd$1);
|
|
464
434
|
return resolveUri_umd$1.exports;
|
|
465
435
|
}
|
|
@@ -840,22 +810,86 @@ function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
|
|
|
840
810
|
hashMap = browserHashMap;
|
|
841
811
|
sourceMapCache = /* @__PURE__ */ new Map();
|
|
842
812
|
method = "run";
|
|
813
|
+
commands;
|
|
843
814
|
constructor(options) {
|
|
844
815
|
super(options.config);
|
|
845
816
|
this.config = options.config;
|
|
817
|
+
this.commands = getBrowserState().commands;
|
|
846
818
|
}
|
|
847
819
|
setMethod(method) {
|
|
848
820
|
this.method = method;
|
|
849
821
|
}
|
|
822
|
+
traces = /* @__PURE__ */ new Map();
|
|
850
823
|
onBeforeTryTask = async (...args) => {
|
|
851
824
|
var _a;
|
|
852
825
|
await userEvent.cleanup();
|
|
853
826
|
await ((_a = super.onBeforeTryTask) == null ? void 0 : _a.call(this, ...args));
|
|
827
|
+
const trace = this.config.browser.trace;
|
|
828
|
+
const test = args[0];
|
|
829
|
+
if (trace === "off") {
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
832
|
+
const { retry, repeats } = args[1];
|
|
833
|
+
if (trace === "on-all-retries" && retry === 0) {
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
836
|
+
if (trace === "on-first-retry" && retry !== 1) {
|
|
837
|
+
return;
|
|
838
|
+
}
|
|
839
|
+
let title = getTestName(test);
|
|
840
|
+
if (retry) {
|
|
841
|
+
title += ` (retry x${retry})`;
|
|
842
|
+
}
|
|
843
|
+
if (repeats) {
|
|
844
|
+
title += ` (repeat x${repeats})`;
|
|
845
|
+
}
|
|
846
|
+
const name = getTraceName(test, retry, repeats);
|
|
847
|
+
await this.commands.triggerCommand(
|
|
848
|
+
"__vitest_startChunkTrace",
|
|
849
|
+
[{ name, title }]
|
|
850
|
+
);
|
|
851
|
+
};
|
|
852
|
+
onAfterRetryTask = async (test, { retry, repeats }) => {
|
|
853
|
+
const trace = this.config.browser.trace;
|
|
854
|
+
if (trace === "off") {
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
857
|
+
if (trace === "on-all-retries" && retry === 0) {
|
|
858
|
+
return;
|
|
859
|
+
}
|
|
860
|
+
if (trace === "on-first-retry" && retry !== 1) {
|
|
861
|
+
return;
|
|
862
|
+
}
|
|
863
|
+
const name = getTraceName(test, retry, repeats);
|
|
864
|
+
if (!this.traces.has(test.id)) {
|
|
865
|
+
this.traces.set(test.id, []);
|
|
866
|
+
}
|
|
867
|
+
const traces = this.traces.get(test.id);
|
|
868
|
+
const { tracePath } = await this.commands.triggerCommand(
|
|
869
|
+
"__vitest_stopChunkTrace",
|
|
870
|
+
[{ name }]
|
|
871
|
+
);
|
|
872
|
+
traces.push(tracePath);
|
|
854
873
|
};
|
|
855
874
|
onAfterRunTask = async (task) => {
|
|
856
|
-
var _a, _b;
|
|
875
|
+
var _a, _b, _c;
|
|
857
876
|
await ((_a = super.onAfterRunTask) == null ? void 0 : _a.call(this, task));
|
|
858
|
-
|
|
877
|
+
const trace = this.config.browser.trace;
|
|
878
|
+
const traces = this.traces.get(task.id) || [];
|
|
879
|
+
if (traces.length) {
|
|
880
|
+
if (trace === "retain-on-failure" && ((_b = task.result) == null ? void 0 : _b.state) === "pass") {
|
|
881
|
+
await this.commands.triggerCommand(
|
|
882
|
+
"__vitest_deleteTracing",
|
|
883
|
+
[{ traces }]
|
|
884
|
+
);
|
|
885
|
+
} else {
|
|
886
|
+
await this.commands.triggerCommand(
|
|
887
|
+
"__vitest_annotateTraces",
|
|
888
|
+
[{ testId: task.id, traces }]
|
|
889
|
+
);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
if (this.config.bail && ((_c = task.result) == null ? void 0 : _c.state) === "fail") {
|
|
859
893
|
const previousFailures = await rpc$2().getCountOfFailedTests();
|
|
860
894
|
const currentFailures = 1 + previousFailures;
|
|
861
895
|
if (currentFailures >= this.config.bail) {
|
|
@@ -890,13 +924,14 @@ function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
|
|
|
890
924
|
await Promise.all([
|
|
891
925
|
(_a = super.onBeforeRunSuite) == null ? void 0 : _a.call(this, suite),
|
|
892
926
|
(async () => {
|
|
893
|
-
if ("filepath" in suite) {
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
927
|
+
if (!("filepath" in suite)) {
|
|
928
|
+
return;
|
|
929
|
+
}
|
|
930
|
+
const map = await rpc$2().getBrowserFileSourceMap(suite.filepath);
|
|
931
|
+
this.sourceMapCache.set(suite.filepath, map);
|
|
932
|
+
const snapshotEnvironment = this.config.snapshotOptions.snapshotEnvironment;
|
|
933
|
+
if (snapshotEnvironment instanceof VitestBrowserSnapshotEnvironment) {
|
|
934
|
+
snapshotEnvironment.addSourceMap(suite.filepath, map);
|
|
900
935
|
}
|
|
901
936
|
})()
|
|
902
937
|
]);
|
|
@@ -959,7 +994,7 @@ function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
|
|
|
959
994
|
onTaskUpdate = (task, events) => {
|
|
960
995
|
return rpc$2().onTaskUpdate(this.method, task, events);
|
|
961
996
|
};
|
|
962
|
-
importFile = async (filepath) => {
|
|
997
|
+
importFile = async (filepath, mode) => {
|
|
963
998
|
let hash = this.hashMap.get(filepath);
|
|
964
999
|
if (!hash) {
|
|
965
1000
|
hash = Date.now().toString();
|
|
@@ -968,6 +1003,10 @@ function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
|
|
|
968
1003
|
const prefix = `/${/^\w:/.test(filepath) ? "@fs/" : ""}`;
|
|
969
1004
|
const query = `browserv=${hash}`;
|
|
970
1005
|
const importpath = `${prefix}${filepath}?${query}`.replace(/\/+/g, "/");
|
|
1006
|
+
const trace = this.config.browser.trace;
|
|
1007
|
+
if (mode === "collect" && trace !== "off") {
|
|
1008
|
+
await this.commands.triggerCommand("__vitest_startTracing", []);
|
|
1009
|
+
}
|
|
971
1010
|
try {
|
|
972
1011
|
await import(
|
|
973
1012
|
/* @vite-ignore */
|
|
@@ -1050,6 +1089,10 @@ async function updateTestFilesLocations(files, sourceMaps) {
|
|
|
1050
1089
|
});
|
|
1051
1090
|
await Promise.all(promises2);
|
|
1052
1091
|
}
|
|
1092
|
+
function getTraceName(task, retryCount, repeatsCount) {
|
|
1093
|
+
const name = getTestName(task, "-").replace(/[^a-z0-9]/gi, "-");
|
|
1094
|
+
return `${name}-${repeatsCount}-${retryCount}`;
|
|
1095
|
+
}
|
|
1053
1096
|
const { Date: Date$1, console: console$1, performance: performance$1 } = globalThis;
|
|
1054
1097
|
function setupConsoleLogSpy() {
|
|
1055
1098
|
const {
|
|
@@ -1,35 +1,27 @@
|
|
|
1
1
|
(function polyfill() {
|
|
2
2
|
const relList = document.createElement("link").relList;
|
|
3
|
-
if (relList && relList.supports && relList.supports("modulepreload"))
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
for (const link of document.querySelectorAll('link[rel="modulepreload"]')) {
|
|
7
|
-
processPreload(link);
|
|
8
|
-
}
|
|
3
|
+
if (relList && relList.supports && relList.supports("modulepreload")) return;
|
|
4
|
+
for (const link of document.querySelectorAll('link[rel="modulepreload"]')) processPreload(link);
|
|
9
5
|
new MutationObserver((mutations) => {
|
|
10
6
|
for (const mutation of mutations) {
|
|
11
|
-
if (mutation.type !== "childList")
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
for (const node of mutation.addedNodes) {
|
|
15
|
-
if (node.tagName === "LINK" && node.rel === "modulepreload")
|
|
16
|
-
processPreload(node);
|
|
17
|
-
}
|
|
7
|
+
if (mutation.type !== "childList") continue;
|
|
8
|
+
for (const node of mutation.addedNodes) if (node.tagName === "LINK" && node.rel === "modulepreload") processPreload(node);
|
|
18
9
|
}
|
|
19
|
-
}).observe(document, {
|
|
10
|
+
}).observe(document, {
|
|
11
|
+
childList: true,
|
|
12
|
+
subtree: true
|
|
13
|
+
});
|
|
20
14
|
function getFetchOpts(link) {
|
|
21
15
|
const fetchOpts = {};
|
|
22
16
|
if (link.integrity) fetchOpts.integrity = link.integrity;
|
|
23
17
|
if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy;
|
|
24
|
-
if (link.crossOrigin === "use-credentials")
|
|
25
|
-
fetchOpts.credentials = "include";
|
|
18
|
+
if (link.crossOrigin === "use-credentials") fetchOpts.credentials = "include";
|
|
26
19
|
else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit";
|
|
27
20
|
else fetchOpts.credentials = "same-origin";
|
|
28
21
|
return fetchOpts;
|
|
29
22
|
}
|
|
30
23
|
function processPreload(link) {
|
|
31
|
-
if (link.ep)
|
|
32
|
-
return;
|
|
24
|
+
if (link.ep) return;
|
|
33
25
|
link.ep = true;
|
|
34
26
|
const fetchOpts = getFetchOpts(link);
|
|
35
27
|
fetch(link.href, fetchOpts);
|
|
@@ -147,6 +139,40 @@ const relative = function(from, to) {
|
|
|
147
139
|
}
|
|
148
140
|
return [..._from.map(() => ".."), ..._to].join("/");
|
|
149
141
|
};
|
|
142
|
+
// @__NO_SIDE_EFFECTS__
|
|
143
|
+
function generateHash(str) {
|
|
144
|
+
let hash = 0;
|
|
145
|
+
if (str.length === 0) {
|
|
146
|
+
return `${hash}`;
|
|
147
|
+
}
|
|
148
|
+
for (let i = 0; i < str.length; i++) {
|
|
149
|
+
const char = str.charCodeAt(i);
|
|
150
|
+
hash = (hash << 5) - hash + char;
|
|
151
|
+
hash = hash & hash;
|
|
152
|
+
}
|
|
153
|
+
return `${hash}`;
|
|
154
|
+
}
|
|
155
|
+
// @__NO_SIDE_EFFECTS__
|
|
156
|
+
function generateFileHash(file, projectName) {
|
|
157
|
+
return /* @__PURE__ */ generateHash(`${file}${projectName || ""}`);
|
|
158
|
+
}
|
|
159
|
+
function getNames(task) {
|
|
160
|
+
const names = [task.name];
|
|
161
|
+
let current = task;
|
|
162
|
+
while (current === null || current === void 0 ? void 0 : current.suite) {
|
|
163
|
+
current = current.suite;
|
|
164
|
+
if (current === null || current === void 0 ? void 0 : current.name) {
|
|
165
|
+
names.unshift(current.name);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (current !== task.file) {
|
|
169
|
+
names.unshift(task.file.name);
|
|
170
|
+
}
|
|
171
|
+
return names;
|
|
172
|
+
}
|
|
173
|
+
function getTestName(task, separator = " > ") {
|
|
174
|
+
return getNames(task).slice(1).join(separator);
|
|
175
|
+
}
|
|
150
176
|
async function importId(id) {
|
|
151
177
|
const name = `/@id/${id}`.replace(/\\/g, "/");
|
|
152
178
|
return (/* @__PURE__ */ getBrowserState()).wrapModule(() => import(
|
|
@@ -187,8 +213,10 @@ function getWorkerState() {
|
|
|
187
213
|
}
|
|
188
214
|
export {
|
|
189
215
|
getConfig as a,
|
|
190
|
-
|
|
191
|
-
|
|
216
|
+
generateFileHash as b,
|
|
217
|
+
resolve as c,
|
|
218
|
+
getWorkerState as d,
|
|
219
|
+
getTestName as e,
|
|
192
220
|
getBrowserState as g,
|
|
193
221
|
moduleRunner as m,
|
|
194
222
|
relative as r
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
{__VITEST_INJECTOR__}
|
|
27
27
|
{__VITEST_ERROR_CATCHER__}
|
|
28
28
|
{__VITEST_SCRIPTS__}
|
|
29
|
-
<script type="module" crossorigin src="/__vitest_browser__/orchestrator-
|
|
30
|
-
<link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-
|
|
29
|
+
<script type="module" crossorigin src="/__vitest_browser__/orchestrator-Pdu7HCGX.js"></script>
|
|
30
|
+
<link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-uxqdqUz8.js">
|
|
31
31
|
</head>
|
|
32
32
|
<body>
|
|
33
33
|
<div id="vitest-tester"></div>
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" href="{__VITEST_FAVICON__}" type="image/svg+xml">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>Vitest Browser Tester</title>
|
|
8
|
-
<script type="module" crossorigin src="/__vitest_browser__/tester-
|
|
9
|
-
<link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-
|
|
8
|
+
<script type="module" crossorigin src="/__vitest_browser__/tester-DYNLfPFH.js"></script>
|
|
9
|
+
<link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-uxqdqUz8.js">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
</body>
|
package/dist/expect-element.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import{expect,chai}from"vitest";import{getType}from"vitest/internal/browser";import{k as kAriaCheckedRoles,i as getAriaChecked,j as getAriaRole,l as getAriaDisabled,m as beginAriaCaches,n as endAriaCaches,o as isElementVisible$1,p as getElementAccessibleDescription,q as getElementAccessibleErrorMessage,r as getElementAccessibleName,s as cssEscape}from"./public-utils-
|
|
2
|
-
`)}function redent(_,K){return indentString(stripIndent(_),K)}function indentString(_,K){
|
|
3
|
-
`)}}class UserInputElementTypeError extends GenericTypeError{constructor(_,K,q){super(`an HTMLElement or an SVGElement`,_,K,q)}}class UserInputNodeTypeError extends GenericTypeError{constructor(_,K,q){super(`a Node`,_,K,q)}}function getTag(_){return _ instanceof HTMLFormElement?`FORM`:_.tagName.toUpperCase()}function isInputElement(_){return getTag(_)===`INPUT`}function getSingleElementValue(_){if(_)switch(getTag(_)){case`INPUT`:return getInputValue(_);case`SELECT`:return getSelectValue(_);default:return _.value??getAccessibleValue(_)}}function getSelectValue({multiple:_,options:K}){let q=[...K].filter(_=>_.selected);if(_)return[...q].map(_=>_.value);if(q.length!==0)return q[0].value}function getInputValue(_){switch(_.type){case`number`:return _.value===``?null:Number(_.value);case`checkbox`:return _.checked;default:return _.value}}const rolesSupportingValues=[`meter`,`progressbar`,`slider`,`spinbutton`];function getAccessibleValue(_){if(rolesSupportingValues.includes(_.getAttribute(`role`)||``))return Number(_.getAttribute(`aria-valuenow`))}function normalize(_){return _.replace(/\s+/g,` `).trim()}function matches(_,K){return K instanceof RegExp?K.test(_):_.includes(String(K))}function arrayAsSetComparison(_,K){if(Array.isArray(_)&&Array.isArray(K)){let q=new Set(K);for(let K of new Set(_))if(!q.has(K))return!1;return!0}}const supportedRoles=getAriaCheckedRoles();function toBeChecked(_){let K=getElementFromUserInput(_,toBeChecked,this)
|
|
1
|
+
import{expect,chai}from"vitest";import{getType}from"vitest/internal/browser";import{k as kAriaCheckedRoles,i as getAriaChecked,j as getAriaRole,l as getAriaDisabled,m as beginAriaCaches,n as endAriaCaches,o as isElementVisible$1,p as getElementAccessibleDescription,q as getElementAccessibleErrorMessage,r as getElementAccessibleName,s as cssEscape}from"./public-utils-B6exS8fl.js";import{L as Locator,b as getWorkerState,d as convertToSelector,a as getBrowserState,p as processTimeoutOptions}from"./index-BPDFwkoW.js";import{server}from"@vitest/browser/context";function getAriaCheckedRoles(){return[...kAriaCheckedRoles]}function getElementFromUserInput(_,K,q){_ instanceof Locator&&(_=_.element());let J=_?.ownerDocument?.defaultView||window;if(_ instanceof J.HTMLElement||_ instanceof J.SVGElement)return _;throw new UserInputElementTypeError(_,K,q)}function getNodeFromUserInput(_,K,q){_ instanceof Locator&&(_=_.element());let J=_.ownerDocument?.defaultView||window;if(_ instanceof J.Node)return _;throw new UserInputNodeTypeError(_,K,q)}function getMessage(_,K,q,J,Y,X){return[`${K}\n`,`${q}:\n${_.utils.EXPECTED_COLOR(redent(display(_,J),2))}`,`${Y}:\n${_.utils.RECEIVED_COLOR(redent(display(_,X),2))}`].join(`
|
|
2
|
+
`)}function redent(_,K){return indentString(stripIndent(_),K)}function indentString(_,K){return _.replace(/^(?!\s*$)/gm,` `.repeat(K))}function minIndent(_){let K=_.match(/^[ \t]*(?=\S)/gm);return K?K.reduce((_,K)=>Math.min(_,K.length),1/0):0}function stripIndent(_){let K=minIndent(_);if(K===0)return _;let q=RegExp(`^[ \\t]{${K}}`,`gm`);return _.replace(q,``)}function display(_,K){return typeof K==`string`?K:_.utils.stringify(K)}function toSentence(_,{wordConnector:K=`, `,lastWordConnector:q=` and `}={}){return[_.slice(0,-1).join(K),_.at(-1)].join(_.length>1?q:``)}class GenericTypeError extends Error{constructor(_,K,q,J){super(),Error.captureStackTrace&&Error.captureStackTrace(this,q);let Y=``;try{Y=J.utils.printWithType(`Received`,K,J.utils.printReceived)}catch{}this.message=[J.utils.matcherHint(`${J.isNot?`.not`:``}.${q.name}`,`received`,``),``,`${J.utils.RECEIVED_COLOR(`received`)} value must ${_} or a Locator that returns ${_}.`,Y].join(`
|
|
3
|
+
`)}}class UserInputElementTypeError extends GenericTypeError{constructor(_,K,q){super(`an HTMLElement or an SVGElement`,_,K,q)}}class UserInputNodeTypeError extends GenericTypeError{constructor(_,K,q){super(`a Node`,_,K,q)}}function getTag(_){return _ instanceof HTMLFormElement?`FORM`:_.tagName.toUpperCase()}function isInputElement(_){return getTag(_)===`INPUT`}function getSingleElementValue(_){if(_)switch(getTag(_)){case`INPUT`:return getInputValue(_);case`SELECT`:return getSelectValue(_);default:return _.value??getAccessibleValue(_)}}function getSelectValue({multiple:_,options:K}){let q=[...K].filter(_=>_.selected);if(_)return[...q].map(_=>_.value);if(q.length!==0)return q[0].value}function getInputValue(_){switch(_.type){case`number`:return _.value===``?null:Number(_.value);case`checkbox`:return _.checked;default:return _.value}}const rolesSupportingValues=[`meter`,`progressbar`,`slider`,`spinbutton`];function getAccessibleValue(_){if(rolesSupportingValues.includes(_.getAttribute(`role`)||``))return Number(_.getAttribute(`aria-valuenow`))}function normalize(_){return _.replace(/\s+/g,` `).trim()}function matches(_,K){return K instanceof RegExp?K.test(_):_.includes(String(K))}function arrayAsSetComparison(_,K){if(Array.isArray(_)&&Array.isArray(K)){let q=new Set(K);for(let K of new Set(_))if(!q.has(K))return!1;return!0}}const supportedRoles=getAriaCheckedRoles();function toBeChecked(_){let K=getElementFromUserInput(_,toBeChecked,this);if(!(()=>isInputElement(K)&&[`checkbox`,`radio`].includes(K.type))()&&!(()=>supportedRoles.includes(getAriaRole(K)||``)&&[`true`,`false`].includes(K.getAttribute(`aria-checked`)||``))())return{pass:!1,message:()=>`only inputs with type="checkbox" or type="radio" or elements with ${supportedRolesSentence()} and a valid aria-checked attribute can be used with .toBeChecked(). Use .toHaveValue() instead`};let q=getAriaChecked(K)===!0;return{pass:q,message:()=>{let _=q?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeChecked`,`element`,``),``,`Received element ${_} checked:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
|
|
4
4
|
`)}}}function supportedRolesSentence(){return toSentence(supportedRoles.map(_=>`role="${_}"`),{lastWordConnector:` or `})}function toBeEmptyDOMElement(_){let K=getElementFromUserInput(_,toBeEmptyDOMElement,this);return{pass:isEmptyElement(K),message:()=>[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeEmptyDOMElement`,`element`,``),``,`Received:`,` ${this.utils.printReceived(K.innerHTML)}`].join(`
|
|
5
|
-
`)}}function isEmptyElement(_){
|
|
5
|
+
`)}}function isEmptyElement(_){return[..._.childNodes].filter(_=>_.nodeType!==Node.COMMENT_NODE).length===0}function toBeDisabled(_){let K=getElementFromUserInput(_,toBeDisabled,this),q=isElementDisabled(K);return{pass:q,message:()=>{let _=q?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeDisabled`,`element`,``),``,`Received element ${_} disabled:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
|
|
6
6
|
`)}}}function toBeEnabled(_){let K=getElementFromUserInput(_,toBeEnabled,this),q=isElementDisabled(K);return{pass:!q,message:()=>{let _=q?`is not`:`is`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeEnabled`,`element`,``),``,`Received element ${_} enabled:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
|
|
7
7
|
`)}}}function isElementDisabled(_){return getTag(_).includes(`-`)?_.hasAttribute(`disabled`):getAriaDisabled(_)}function toBeInTheDocument(_){let K=null;(_!==null||!this.isNot)&&(K=getElementFromUserInput(_,toBeInTheDocument,this));let q=K===null?!1:K.ownerDocument===K.getRootNode({composed:!0}),J=()=>`expected document not to contain element, found ${this.utils.stringify(K?.cloneNode(!0))} instead`,Y=()=>`element could not be found in the document`;return{pass:q,message:()=>[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeInTheDocument`,`element`,``),``,this.utils.RECEIVED_COLOR(this.isNot?J():Y())].join(`
|
|
8
8
|
`)}}const FORM_TAGS$1=[`FORM`,`INPUT`,`SELECT`,`TEXTAREA`];function isElementHavingAriaInvalid(_){return _.hasAttribute(`aria-invalid`)&&_.getAttribute(`aria-invalid`)!==`false`}function isSupportsValidityMethod(_){return FORM_TAGS$1.includes(getTag(_))}function isElementInvalid(_){let K=isElementHavingAriaInvalid(_);return isSupportsValidityMethod(_)?K||!_.checkValidity():K}function toBeInvalid(_){let K=getElementFromUserInput(_,toBeInvalid,this),q=isElementInvalid(K);return{pass:q,message:()=>{let _=q?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeInvalid`,`element`,``),``,`Received element ${_} currently invalid:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
|
|
9
9
|
`)}}}function toBeValid(_){let K=getElementFromUserInput(_,toBeInvalid,this),q=!isElementInvalid(K);return{pass:q,message:()=>{let _=q?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeValid`,`element`,``),``,`Received element ${_} currently valid:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
|
|
10
10
|
`)}}}function toBeInViewport(_,K){let q=getElementFromUserInput(_,toBeInViewport,this),J=K?.ratio??0;return getViewportIntersection(q,J).then(({pass:_,ratio:K})=>({pass:_,message:()=>{let Y=_?`is`:`is not`,X=J>0?` with ratio ${J}`:``,Z=K===void 0?``:` (actual ratio: ${K.toFixed(3)})`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeInViewport`,`element`,``),``,`Received element ${Y} in viewport${X}${Z}:`,` ${this.utils.printReceived(q.cloneNode(!1))}`].join(`
|
|
11
|
-
`)}}))}async function getViewportIntersection(_,K){let q=await new Promise(K=>{let q=new IntersectionObserver(_=>{_.length>0?K(_[0].intersectionRatio):K(0),q.disconnect()});q.observe(_),requestAnimationFrame(()=>{})})
|
|
12
|
-
`)}}}function isAriaMixed(_){let K=getAriaChecked(_)===`mixed`;
|
|
11
|
+
`)}}))}async function getViewportIntersection(_,K){let q=await new Promise(K=>{let q=new IntersectionObserver(_=>{_.length>0?K(_[0].intersectionRatio):K(0),q.disconnect()});q.observe(_),requestAnimationFrame(()=>{})});return{pass:q>0&&q>K-1e-9,ratio:q}}function toBePartiallyChecked(_){let K=getElementFromUserInput(_,toBePartiallyChecked,this);if(!(()=>isInputElement(K)&&K.type===`checkbox`)()&&!(()=>K.getAttribute(`role`)===`checkbox`)())return{pass:!1,message:()=>`only inputs with type="checkbox" or elements with role="checkbox" and a valid aria-checked attribute can be used with .toBePartiallyChecked(). Use .toHaveValue() instead`};let q=isAriaMixed(K);return{pass:q,message:()=>{let _=q?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBePartiallyChecked`,`element`,``),``,`Received element ${_} partially checked:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
|
|
12
|
+
`)}}}function isAriaMixed(_){let K=getAriaChecked(_)===`mixed`;return!K&&isInputElement(_)&&[`checkbox`,`radio`].includes(_.type)&&_.getAttribute(`aria-checked`)===`mixed`?!0:K}const FORM_TAGS=[`SELECT`,`TEXTAREA`],ARIA_FORM_TAGS=[`INPUT`,`SELECT`,`TEXTAREA`],UNSUPPORTED_INPUT_TYPES=[`color`,`hidden`,`range`,`submit`,`image`,`reset`],SUPPORTED_ARIA_ROLES=[`checkbox`,`combobox`,`gridcell`,`listbox`,`radiogroup`,`spinbutton`,`textbox`,`tree`];function isRequiredOnFormTagsExceptInput(_){return FORM_TAGS.includes(getTag(_))&&_.hasAttribute(`required`)}function isRequiredOnSupportedInput(_){return getTag(_)===`INPUT`&&_.hasAttribute(`required`)&&(_.hasAttribute(`type`)&&!UNSUPPORTED_INPUT_TYPES.includes(_.getAttribute(`type`)||``)||!_.hasAttribute(`type`))}function isElementRequiredByARIA(_){return _.hasAttribute(`aria-required`)&&_.getAttribute(`aria-required`)===`true`&&(ARIA_FORM_TAGS.includes(getTag(_))||_.hasAttribute(`role`)&&SUPPORTED_ARIA_ROLES.includes(_.getAttribute(`role`)||``))}function toBeRequired(_){let K=getElementFromUserInput(_,toBeRequired,this),q=isRequiredOnFormTagsExceptInput(K)||isRequiredOnSupportedInput(K)||isElementRequiredByARIA(K);return{pass:q,message:()=>{let _=q?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeRequired`,`element`,``),``,`Received element ${_} required:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
|
|
13
13
|
`)}}}function toBeVisible(_){let K=getElementFromUserInput(_,toBeVisible,this),q=K.ownerDocument===K.getRootNode({composed:!0});beginAriaCaches();let J=q&&isElementVisible(K);return endAriaCaches(),{pass:J,message:()=>{let _=J?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeVisible`,`element`,``),``,`Received element ${_} visible${q?``:` (element is not in the document)`}:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
|
|
14
14
|
`)}}}function isElementVisible(_){let K=isElementVisible$1(_);if(server.browser!==`webkit`)return K;let q=_.closest(`details`);return!q||_===q?K:isElementVisibleInDetails(_)}function isElementVisibleInDetails(_){let K=_;for(;K;){if(K.tagName===`DETAILS`){let q=K.querySelector(`summary`)===_;if(!K.open&&!q)return!1}K=K.parentElement}return _.offsetParent!==null}function toContainElement(_,K){let q=getElementFromUserInput(_,toContainElement,this),J=K===null?null:getElementFromUserInput(K,toContainElement,this);return{pass:q.contains(J),message:()=>[this.utils.matcherHint(`${this.isNot?`.not`:``}.toContainElement`,`element`,`element`),``,this.utils.RECEIVED_COLOR(`${this.utils.stringify(q.cloneNode(!1))} ${this.isNot?`contains:`:`does not contain:`} ${this.utils.stringify(J?J.cloneNode(!1):null)}
|
|
15
15
|
`)].join(`
|
|
@@ -20,8 +20,8 @@ import{expect,chai}from"vitest";import{getType}from"vitest/internal/browser";imp
|
|
|
20
20
|
`)}}function getExpectedClassNamesAndOptions(_){let K=_.pop(),q,J;return typeof K==`object`&&!(K instanceof RegExp)?(q=_,J=K):(q=_.concat(K),J={exact:!1}),{expectedClassNames:q,options:J}}function splitClassNames(_){return _?_.split(/\s+/).filter(_=>_.length>0):[]}function isSubset$1(_,K){return _.every(_=>typeof _==`string`?K.includes(_):K.some(K=>_.test(K)))}function toHaveDisplayValue(_,K){let q=getElementFromUserInput(_,toHaveDisplayValue,this),J=getTag(q);if(![`SELECT`,`INPUT`,`TEXTAREA`].includes(J))throw Error(`.toHaveDisplayValue() currently supports only input, textarea or select elements, try with another matcher instead.`);if(isInputElement(q)&&[`radio`,`checkbox`].includes(q.type))throw Error(`.toHaveDisplayValue() currently does not support input[type="${q.type}"], try with another matcher instead.`);let Y=getValues(J,q),X=getExpectedValues(K),Z=X.filter(_=>Y.some(K=>_ instanceof RegExp?_.test(K):this.equals(K,String(_),this.customTesters))).length,Q=Z===Y.length,$=Z===X.length;return{pass:Q&&$,message:()=>getMessage(this,this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveDisplayValue`,`element`,``),`Expected element ${this.isNot?`not `:``}to have display value`,K,`Received`,Y)}}function getValues(_,K){return _===`SELECT`?Array.from(K).filter(_=>_.selected).map(_=>_.textContent||``):[K.value]}function getExpectedValues(_){return Array.isArray(_)?_:[_]}function toHaveFocus(_){let K=getElementFromUserInput(_,toHaveFocus,this);return{pass:K.ownerDocument.activeElement===K,message:()=>[this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveFocus`,`element`,``),``,...this.isNot?[`Received element is focused:`,` ${this.utils.printReceived(K)}`]:[`Expected element with focus:`,` ${this.utils.printExpected(K)}`,`Received element with focus:`,` ${this.utils.printReceived(K.ownerDocument.activeElement)}`]].join(`
|
|
21
21
|
`)}}function toHaveFormValues(_,K){let q=getElementFromUserInput(_,toHaveFormValues,this),J=q.ownerDocument.defaultView||window;if(!(q instanceof J.HTMLFieldSetElement)&&!(q instanceof J.HTMLFormElement))throw TypeError(`toHaveFormValues must be called on a form or a fieldset, instead got ${getTag(q)}`);if(!K||typeof K!=`object`)throw TypeError(`toHaveFormValues must be called with an object of expected form values. Got ${K}`);let Y=getAllFormValues(q);return{pass:Object.entries(K).every(([_,K])=>this.equals(Y[_],K,[arrayAsSetComparison,...this.customTesters])),message:()=>{let _=this.isNot?`not to`:`to`,q=`${this.isNot?`.not`:``}.toHaveFormValues`,J={};for(let _ in Y){if(!Object.hasOwn(K,_))continue;J[_]=Y[_]}return[this.utils.matcherHint(q,`element`,``),`Expected the element ${_} have form values`,this.utils.diff(K,J)].join(`
|
|
22
22
|
|
|
23
|
-
`)}}}function getMultiElementValue(_){let K=[...new Set(_.map(_=>_.type))];if(K.length!==1)throw Error(`Multiple form elements with the same name must be of the same type`);switch(K[0]){case`radio`:{let K=_.find(_=>_.checked);return K?K.value:void 0}case`checkbox`:return _.filter(_=>_.checked).map(_=>_.value);default:return _.map(_=>_.value)}}function getFormValue(_,K){let q=[..._.querySelectorAll(`[name="${cssEscape(K)}"]`)];if(q.length!==0)switch(q.length){case 1:return getSingleElementValue(q[0]);default:return getMultiElementValue(q)}}function getPureName(_){return/\[\]$/.test(_)?_.slice(0,-2):_}function getAllFormValues(_){let K={};for(let q of _.elements){if(!(`name`in q))continue;let J=q.name;K[getPureName(J)]=getFormValue(_,J)}return K}function toHaveRole(_,K){let q=getElementFromUserInput(_,toHaveRole,this);beginAriaCaches();let J=getAriaRole(q);return endAriaCaches(),{pass:J===K,message:()=>{let _=this.isNot?`not to`:`to`;return getMessage(this,this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveRole`,`element`,``),`Expected element ${_} have role`,K,`Received`,J)}}}function toHaveSelection(_,K){let q=getElementFromUserInput(_,toHaveSelection,this),J=K!==void 0;if(J&&typeof K!=`string`)throw Error(`expected selection must be a string or undefined`);let Y=getSelection(q);return{pass:J?this.equals(Y,K,[arrayAsSetComparison,...this.customTesters]):!!Y,message:()=>{let _=this.isNot?`not to`:`to`,q=this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveSelection`,`element`,K);return getMessage(this,q,`Expected the element ${_} have selection`,J?K:`(any)`,`Received`,Y)}}}function getSelection(_){let K=_.ownerDocument.getSelection();if(!K)return``;if([`INPUT`,`TEXTAREA`].includes(getTag(_))){let K=_;return[`radio`,`checkbox`].includes(K.type)||K.selectionStart==null||K.selectionEnd==null?``:K.value.toString().substring(K.selectionStart,K.selectionEnd)}if(K.anchorNode===null||K.focusNode===null)return``;let q=K.getRangeAt(0),J=_.ownerDocument.createRange();if(K.containsNode(_,!1))J.selectNodeContents(_),K.removeAllRanges(),K.addRange(J);else if(!(_.contains(K.anchorNode)&&_.contains(K.focusNode))){let Y=_===q.startContainer||_.contains(q.startContainer),X=_===q.endContainer||_.contains(q.endContainer);K.removeAllRanges(),(Y||X)&&(J.selectNodeContents(_),Y&&J.setStart(q.startContainer,q.startOffset),X&&J.setEnd(q.endContainer,q.endOffset),K.addRange(J))}let Y=K.toString();return K.removeAllRanges(),K.addRange(q),Y}const browser=server.config.browser.name,usedValuesProps=new Set(`backgroundPosition.background-position.bottom.left.right.top.height.width.margin-bottom.marginBottom.margin-left.marginLeft.margin-right.marginRight.margin-top.marginTop.min-height.minHeight.min-width.minWidth.padding-bottom.padding-left.padding-right.padding-top.text-indent.paddingBottom.paddingLeft.paddingRight.paddingTop.textIndent`.split(`.`));function toHaveStyle(_,K){let q=getElementFromUserInput(_,toHaveStyle,this),{getComputedStyle:J}=q.ownerDocument.defaultView,Y=typeof K==`object`?getStyleFromObjectCSS(K):computeCSSStyleDeclaration(K),X=J(q),Z=new Set(Array.from(q.style));return{pass:isSubset(Y,q,X,Z),message:()=>{let _=`${this.isNot?`.not`:``}.toHaveStyle`,K=new Set(Object.keys(Y)),J=Array.from(X).filter(_=>K.has(_)).reduce((_,K)=>
|
|
23
|
+
`)}}}function getMultiElementValue(_){let K=[...new Set(_.map(_=>_.type))];if(K.length!==1)throw Error(`Multiple form elements with the same name must be of the same type`);switch(K[0]){case`radio`:{let K=_.find(_=>_.checked);return K?K.value:void 0}case`checkbox`:return _.filter(_=>_.checked).map(_=>_.value);default:return _.map(_=>_.value)}}function getFormValue(_,K){let q=[..._.querySelectorAll(`[name="${cssEscape(K)}"]`)];if(q.length!==0)switch(q.length){case 1:return getSingleElementValue(q[0]);default:return getMultiElementValue(q)}}function getPureName(_){return/\[\]$/.test(_)?_.slice(0,-2):_}function getAllFormValues(_){let K={};for(let q of _.elements){if(!(`name`in q))continue;let J=q.name;K[getPureName(J)]=getFormValue(_,J)}return K}function toHaveRole(_,K){let q=getElementFromUserInput(_,toHaveRole,this);beginAriaCaches();let J=getAriaRole(q);return endAriaCaches(),{pass:J===K,message:()=>{let _=this.isNot?`not to`:`to`;return getMessage(this,this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveRole`,`element`,``),`Expected element ${_} have role`,K,`Received`,J)}}}function toHaveSelection(_,K){let q=getElementFromUserInput(_,toHaveSelection,this),J=K!==void 0;if(J&&typeof K!=`string`)throw Error(`expected selection must be a string or undefined`);let Y=getSelection(q);return{pass:J?this.equals(Y,K,[arrayAsSetComparison,...this.customTesters]):!!Y,message:()=>{let _=this.isNot?`not to`:`to`,q=this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveSelection`,`element`,K);return getMessage(this,q,`Expected the element ${_} have selection`,J?K:`(any)`,`Received`,Y)}}}function getSelection(_){let K=_.ownerDocument.getSelection();if(!K)return``;if([`INPUT`,`TEXTAREA`].includes(getTag(_))){let K=_;return[`radio`,`checkbox`].includes(K.type)||K.selectionStart==null||K.selectionEnd==null?``:K.value.toString().substring(K.selectionStart,K.selectionEnd)}if(K.anchorNode===null||K.focusNode===null)return``;let q=K.getRangeAt(0),J=_.ownerDocument.createRange();if(K.containsNode(_,!1))J.selectNodeContents(_),K.removeAllRanges(),K.addRange(J);else if(!(_.contains(K.anchorNode)&&_.contains(K.focusNode))){let Y=_===q.startContainer||_.contains(q.startContainer),X=_===q.endContainer||_.contains(q.endContainer);K.removeAllRanges(),(Y||X)&&(J.selectNodeContents(_),Y&&J.setStart(q.startContainer,q.startOffset),X&&J.setEnd(q.endContainer,q.endOffset),K.addRange(J))}let Y=K.toString();return K.removeAllRanges(),K.addRange(q),Y}const browser=server.config.browser.name,usedValuesProps=new Set(`backgroundPosition.background-position.bottom.left.right.top.height.width.margin-bottom.marginBottom.margin-left.marginLeft.margin-right.marginRight.margin-top.marginTop.min-height.minHeight.min-width.minWidth.padding-bottom.padding-left.padding-right.padding-top.text-indent.paddingBottom.paddingLeft.paddingRight.paddingTop.textIndent`.split(`.`));function toHaveStyle(_,K){let q=getElementFromUserInput(_,toHaveStyle,this),{getComputedStyle:J}=q.ownerDocument.defaultView,Y=typeof K==`object`?getStyleFromObjectCSS(K):computeCSSStyleDeclaration(K),X=J(q),Z=new Set(Array.from(q.style));return{pass:isSubset(Y,q,X,Z),message:()=>{let _=`${this.isNot?`.not`:``}.toHaveStyle`,K=new Set(Object.keys(Y)),J=Array.from(X).filter(_=>K.has(_)).reduce((_,K)=>(_[K]=(Z.has(K)&&usedValuesProps.has(K)?q.style:X)[K],_),{}),Q=printoutObjectStyles(J),$=Q===``?`Expected styles could not be parsed by the browser. Did you make a typo?`:this.utils.diff(printoutObjectStyles(Y),Q);return[this.utils.matcherHint(_,`element`,``),$].join(`
|
|
24
24
|
|
|
25
|
-
`)}}}function getStyleFromObjectCSS(_){let K=browser===`chrome`||browser===`chromium`?document:document.implementation.createHTMLDocument(``),q=K.createElement(`div`);K.body.appendChild(q);let J=Object.keys(_);J.forEach(K=>{q.style[K]=_[K]});let Y={},X=window.getComputedStyle(q);return J.forEach(_=>{let K=usedValuesProps.has(_)?q.style:X
|
|
26
|
-
`)}function isSubset(_,K,q,J){let Y=Object.keys(_);return Y.length?Y.every(Y=>{let X=_[Y],Z=Y.startsWith(`--`),Q=[Y];Z||Q.push(Y.toLowerCase())
|
|
27
|
-
`)}}const matchers={toBeDisabled,toBeEnabled,toBeEmptyDOMElement,toBeInTheDocument,toBeInViewport,toBeInvalid,toBeRequired,toBeValid,toBeVisible,toContainElement,toContainHTML,toHaveAccessibleDescription,toHaveAccessibleErrorMessage,toHaveAccessibleName,toHaveAttribute,toHaveClass,toHaveFocus,toHaveFormValues,toHaveStyle,toHaveTextContent,toHaveValue,toHaveDisplayValue,toBeChecked,toBePartiallyChecked,toHaveRole,toHaveSelection,toMatchScreenshot},kLocator=Symbol.for(`$$vitest:locator`);function element(J,Y){if(J!=null&&!(J instanceof HTMLElement)&&!(J instanceof SVGElement)&&!(kLocator in J))throw Error(`Invalid element or locator: ${J}. Expected an instance of HTMLElement, SVGElement or Locator, received ${getType(J)}`);return expect.poll(function(){if(J instanceof Element||J==null)return J;chai.util.flag(this,`_poll.element`,!0);let _=chai.util.flag(this,`negate`),q=chai.util.flag(this,`_name`);if(_&&q===`toBeInTheDocument`)return J.query();if(q===`toHaveLength`)return J.elements();
|
|
25
|
+
`)}}}function getStyleFromObjectCSS(_){let K=browser===`chrome`||browser===`chromium`?document:document.implementation.createHTMLDocument(``),q=K.createElement(`div`);K.body.appendChild(q);let J=Object.keys(_);J.forEach(K=>{q.style[K]=_[K]});let Y={},X=window.getComputedStyle(q);return J.forEach(_=>{let K=(usedValuesProps.has(_)?q.style:X)[_];K!=null&&(Y[_]=K)}),q.remove(),Y}function computeCSSStyleDeclaration(_){let K=browser===`chrome`||browser===`chromium`||browser===`webkit`?document:document.implementation.createHTMLDocument(``),q=K.createElement(`div`);q.setAttribute(`style`,_.replace(/\n/g,``)),K.body.appendChild(q);let J=window.getComputedStyle(q),Y=Array.from(q.style).reduce((_,K)=>(_[K]=usedValuesProps.has(K)?q.style.getPropertyValue(K):J.getPropertyValue(K),_),{});return q.remove(),Y}function printoutObjectStyles(_){return Object.keys(_).sort().map(K=>`${K}: ${_[K]};`).join(`
|
|
26
|
+
`)}function isSubset(_,K,q,J){let Y=Object.keys(_);return Y.length?Y.every(Y=>{let X=_[Y],Z=Y.startsWith(`--`),Q=[Y];return Z||Q.push(Y.toLowerCase()),Q.some(_=>{let Z=J.has(Y)&&usedValuesProps.has(Y)?K.style:q;return Z[_]===X||Z.getPropertyValue(_)===X})}):!1}function toHaveTextContent(_,K,q={normalizeWhitespace:!0}){let J=getNodeFromUserInput(_,toHaveTextContent,this),Y=q.normalizeWhitespace?normalize(J.textContent||``):(J.textContent||``).replace(/\u00A0/g,` `),X=Y!==``&&K===``;return{pass:!X&&matches(Y,K),message:()=>{let _=this.isNot?`not to`:`to`;return getMessage(this,this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveTextContent`,`element`,``),X?`Checking with empty string will always match, use .toBeEmptyDOMElement() instead`:`Expected element ${_} have text content`,K,`Received`,Y)}}}function toHaveValue(_,K){let q=getElementFromUserInput(_,toHaveValue,this);if(isInputElement(q)&&[`checkbox`,`radio`].includes(q.type))throw Error(`input with type=checkbox or type=radio cannot be used with .toHaveValue(). Use .toBeChecked() for type=checkbox or .toHaveFormValues() instead`);let J=getSingleElementValue(q),Y=K!==void 0,X=K,Z=J;return K==J&&K!==J&&(X=`${K} (${typeof K})`,Z=`${J} (${typeof J})`),{pass:Y?this.equals(J,K,[arrayAsSetComparison,...this.customTesters]):!!J,message:()=>{let _=this.isNot?`not to`:`to`,q=this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveValue`,`element`,K);return getMessage(this,q,`Expected the element ${_} have value`,Y?X:`(any)`,`Received`,Z)}}}const counters=new Map([]);async function toMatchScreenshot(_,K,q=typeof K==`object`?K:{}){if(this.isNot)throw Error(`'toMatchScreenshot' cannot be used with "not"`);let J=getWorkerState().current;if(J===void 0||this.currentTestName===void 0)throw Error(`'toMatchScreenshot' cannot be used without test context`);let Y=`${J.result?.repeatCount??0}${this.testPath}${this.currentTestName}`,X=counters.get(Y);X===void 0&&(X={current:0},counters.set(Y,X)),X.current+=1;let Z=typeof K==`string`?K:`${this.currentTestName} ${X.current}`,Q=q.screenshotOptions&&`mask`in q.screenshotOptions?{...q,screenshotOptions:{...q.screenshotOptions,mask:q.screenshotOptions.mask.map(convertToSelector)}}:q,$=await getBrowserState().commands.triggerCommand(`__vitest_screenshotMatcher`,[Z,this.currentTestName,{element:convertToSelector(_),...Q}]);if($.pass===!1&&`context`in J){let{annotate:_}=J.context,K=[];$.reference&&K.push(_(`Reference screenshot`,{path:$.reference})),$.actual&&K.push(_(`Actual screenshot`,{path:$.actual})),$.diff&&K.push(_(`Diff`,{path:$.diff})),await Promise.all(K)}return{pass:$.pass,message:()=>$.pass?``:[this.utils.matcherHint(`toMatchScreenshot`,`element`,``),``,$.message,$.reference?`\nReference screenshot:\n ${this.utils.EXPECTED_COLOR($.reference)}`:null,$.actual?`\nActual screenshot:\n ${this.utils.RECEIVED_COLOR($.actual)}`:null,$.diff?this.utils.DIM_COLOR(`\nDiff image:\n ${$.diff}`):null].filter(_=>_!==null).join(`
|
|
27
|
+
`)}}const matchers={toBeDisabled,toBeEnabled,toBeEmptyDOMElement,toBeInTheDocument,toBeInViewport,toBeInvalid,toBeRequired,toBeValid,toBeVisible,toContainElement,toContainHTML,toHaveAccessibleDescription,toHaveAccessibleErrorMessage,toHaveAccessibleName,toHaveAttribute,toHaveClass,toHaveFocus,toHaveFormValues,toHaveStyle,toHaveTextContent,toHaveValue,toHaveDisplayValue,toBeChecked,toBePartiallyChecked,toHaveRole,toHaveSelection,toMatchScreenshot},kLocator=Symbol.for(`$$vitest:locator`);function element(J,Y){if(J!=null&&!(J instanceof HTMLElement)&&!(J instanceof SVGElement)&&!(kLocator in J))throw Error(`Invalid element or locator: ${J}. Expected an instance of HTMLElement, SVGElement or Locator, received ${getType(J)}`);return expect.poll(function(){if(J instanceof Element||J==null)return J;chai.util.flag(this,`_poll.element`,!0);let _=chai.util.flag(this,`negate`),q=chai.util.flag(this,`_name`);if(_&&q===`toBeInTheDocument`)return J.query();if(q===`toHaveLength`)return J.elements();if(chai.util.flag(this,`_isLastPollAttempt`))return J.element();let Y=J.query();if(!Y)throw Error(`Cannot find element with locator: ${JSON.stringify(J)}`);return Y},processTimeoutOptions(Y))}expect.extend(matchers),expect.element=element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{server,page}from"@vitest/browser/context";import{I as Ivya,e as getByRoleSelector,c as getByAltTextSelector,f as getByLabelSelector,b as getByPlaceholderSelector,d as getByTestIdSelector,a as getByTextSelector,g as getByTitleSelector,h as getElementError}from"./public-utils-B6exS8fl.js";function ensureAwaited(e){let S=getWorkerState().current;if(!S||S.type!==`test`)return e();let C=!1,w=Error(`STACK_TRACE_ERROR`);S.onFinished??=[],S.onFinished.push(()=>{if(!C){let e=Error(`The call was not awaited. This method is asynchronous and must be awaited; otherwise, the call will not start to avoid unhandled rejections.`);throw e.stack=w.stack?.replace(w.message,e.message),e}});let T;return{then(S,E){return C=!0,(T||=e(w)).then(S,E)},catch(S){return(T||=e(w)).catch(S)},finally(S){return(T||=e(w)).finally(S)},[Symbol.toStringTag]:`Promise`}}function getBrowserState(){return window.__vitest_browser_runner__}function getWorkerState(){let e=window.__vitest_worker__;if(!e)throw Error(`Worker state is not found. This is an issue with Vitest. Please, open an issue.`);return e}const provider=getBrowserState().provider;function convertElementToCssSelector(e){if(!e||!(e instanceof Element))throw Error(`Expected DOM element to be an instance of Element, received ${typeof e}`);return getUniqueCssSelector(e)}function escapeIdForCSSSelector(e){return e.split(``).map(e=>{let S=e.charCodeAt(0);return e===` `||e===`#`||e===`.`||e===`:`||e===`[`||e===`]`||e===`>`||e===`+`||e===`~`||e===`\\`?`\\${e}`:S>=65536?`\\${S.toString(16).toUpperCase().padStart(6,`0`)} `:S<32||S===127||S>=128?`\\${S.toString(16).toUpperCase().padStart(2,`0`)} `:e}).join(``)}function getUniqueCssSelector(e){let S=[],C,w=!1;for(;C=getParent(e);){C.shadowRoot&&(w=!0);let T=e.tagName;if(e.id)S.push(`#${escapeIdForCSSSelector(e.id)}`);else if(!e.nextElementSibling&&!e.previousElementSibling)S.push(T.toLowerCase());else{let w=0,E=0,D=0;for(let S of C.children)w++,S.tagName===T&&E++,S===e&&(D=w);E>1?S.push(`${T.toLowerCase()}:nth-child(${D})`):S.push(T.toLowerCase())}e=C}return`${getBrowserState().provider===`webdriverio`&&w?`>>>`:``}${S.reverse().join(` > `)}`}function getParent(e){let S=e.parentNode;return S instanceof ShadowRoot?S.host:S}const now=Date.now;function processTimeoutOptions(e){if(e&&e.timeout!=null||provider!==`playwright`||getWorkerState().config.browser.providerOptions.actionTimeout!=null)return e;let S=getBrowserState().runner,C=S._currentTaskStartTime;if(!C)return e;let w=S._currentTaskTimeout;if(w===0||w==null||w===1/0)return e;e||={};let T=now(),E=C+w-T;return E<=0||(e.timeout=E-100),e}function getIframeScale(){let e=window.parent.document.querySelector(`iframe[data-vitest]`)?.parentElement;if(!e)throw Error(`Cannot find Tester element. This is a bug in Vitest. Please, open a new issue with reproduction.`);let S=e.getAttribute(`data-scale`),C=Number(S);if(Number.isNaN(C))throw TypeError(`Cannot parse scale value from Tester element (${S}). This is a bug in Vitest. Please, open a new issue with reproduction.`);return C}function escapeRegexForSelector(e){return e.unicode||e.unicodeSets?String(e):String(e).replace(/(^|[^\\])(\\\\)*(["'`])/g,`$1$2\\$3`).replace(/>>/g,`\\>\\>`)}function escapeForTextSelector(e,S){return typeof e==`string`?`${JSON.stringify(e)}i`:escapeRegexForSelector(e)}function convertToSelector(e){if(!e)throw Error(`Expected element or locator to be defined.`);if(e instanceof Element)return convertElementToCssSelector(e);if(`selector`in e)return e.selector;throw Error(`Expected element or locator to be an instance of Element or Locator.`)}const selectorEngine=Ivya.create({browser:(e=>{switch(e){case`edge`:case`chrome`:return`chromium`;case`safari`:return`webkit`;default:return e}})(server.config.browser.name),testIdAttribute:server.config.browser.locators.testIdAttribute}),kLocator=Symbol.for(`$$vitest:locator`);class Locator{_parsedSelector;_container;_pwSelector;constructor(){Object.defineProperty(this,kLocator,{enumerable:!1,writable:!1,configurable:!1,value:kLocator})}click(e={}){return this.triggerCommand(`__vitest_click`,this.selector,e)}dblClick(e={}){return this.triggerCommand(`__vitest_dblClick`,this.selector,e)}tripleClick(e={}){return this.triggerCommand(`__vitest_tripleClick`,this.selector,e)}clear(e){return this.triggerCommand(`__vitest_clear`,this.selector,e)}hover(e){return this.triggerCommand(`__vitest_hover`,this.selector,e)}unhover(e){return this.triggerCommand(`__vitest_hover`,`html > body`,e)}fill(e,S){return this.triggerCommand(`__vitest_fill`,this.selector,e,S)}async upload(e,S){let C=(Array.isArray(e)?e:[e]).map(async e=>{if(typeof e==`string`)return e;let S=await new Promise((S,C)=>{let w=new FileReader;w.onload=()=>S(w.result),w.onerror=()=>C(Error(`Failed to read file: ${e.name}`)),w.readAsDataURL(e)});return{name:e.name,mimeType:e.type,base64:S}});return this.triggerCommand(`__vitest_upload`,this.selector,await Promise.all(C),S)}dropTo(e,S={}){return this.triggerCommand(`__vitest_dragAndDrop`,this.selector,e.selector,S)}selectOptions(e,S){let C=(Array.isArray(e)?e:[e]).map(e=>typeof e==`string`?e:{element:`element`in e?e.selector:selectorEngine.generateSelectorSimple(e)});return this.triggerCommand(`__vitest_selectOptions`,this.selector,C,S)}screenshot(e){return page.screenshot({...e,element:this})}getByRole(e,S){return this.locator(getByRoleSelector(e,S))}getByAltText(e,S){return this.locator(getByAltTextSelector(e,S))}getByLabelText(e,S){return this.locator(getByLabelSelector(e,S))}getByPlaceholder(e,S){return this.locator(getByPlaceholderSelector(e,S))}getByTestId(S){return this.locator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,S))}getByText(e,S){return this.locator(getByTextSelector(e,S))}getByTitle(e,S){return this.locator(getByTitleSelector(e,S))}filter(e){let S=[];if(e?.hasText&&S.push(`internal:has-text=${escapeForTextSelector(e.hasText)}`),e?.hasNotText&&S.push(`internal:has-not-text=${escapeForTextSelector(e.hasNotText)}`),e?.has){let C=e.has;S.push(`internal:has=${JSON.stringify(C._pwSelector||C.selector)}`)}if(e?.hasNot){let C=e.hasNot;S.push(`internal:has-not=${JSON.stringify(C._pwSelector||C.selector)}`)}if(!S.length)throw Error(`Locator.filter expects at least one filter. None provided.`);return this.locator(S.join(` >> `))}and(e){return this.locator(`internal:and=${JSON.stringify(e._pwSelector||e.selector)}`)}or(e){return this.locator(`internal:or=${JSON.stringify(e._pwSelector||e.selector)}`)}query(){let e=this._parsedSelector||=selectorEngine.parseSelector(this._pwSelector||this.selector);return selectorEngine.querySelector(e,document.documentElement,!0)}element(){let e=this.query();if(!e)throw getElementError(this._pwSelector||this.selector,this._container||document.body);return e}elements(){let e=this._parsedSelector||=selectorEngine.parseSelector(this._pwSelector||this.selector);return selectorEngine.querySelectorAll(e,document.documentElement)}get length(){return this.elements().length}all(){return this.elements().map(e=>this.elementLocator(e))}nth(e){return this.locator(`nth=${e}`)}first(){return this.nth(0)}last(){return this.nth(-1)}toString(){return this.selector}toJSON(){return this.selector}triggerCommand(e,...S){let C=getBrowserState().commands;return ensureAwaited(w=>C.triggerCommand(e,S,w))}}export{Locator as L,getBrowserState as a,getWorkerState as b,convertElementToCssSelector as c,convertToSelector as d,getIframeScale as g,processTimeoutOptions as p,selectorEngine as s};
|