@vitest/browser 5.0.0-beta.5 → 5.0.0-beta.7
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_browser__/{orchestrator-bDJB3Bid.js → orchestrator-Bdv4lWwV.js} +60 -14
- package/dist/client/__vitest_browser__/rrweb-snapshot-DkFyu2W8.js +4665 -0
- package/dist/client/__vitest_browser__/{tester-C1kIlbPd.js → tester-CREI5Ivt.js} +73 -50
- package/dist/client/orchestrator.html +1 -1
- package/dist/client/tester/tester.html +1 -1
- package/dist/context.js +6 -5
- package/dist/expect-element.js +2 -2
- package/dist/index.d.ts +10 -2
- package/dist/index.js +543 -550
- package/dist/{locators-CPBpJv8y.js → locators-Cxk-0tRh.js} +1 -1
- package/dist/locators.js +1 -1
- package/dist/state.js +1 -0
- package/package.json +9 -9
- package/dist/client/__vitest_browser__/rrweb-snapshot-iZCFA2to.js +0 -4388
|
@@ -2,7 +2,7 @@ import { a as moduleRunner, d as resolve, i as getWorkerState, l as getTestName,
|
|
|
2
2
|
import { channel, client, globalChannel, onCancel, registerPageMarkHandler } from "@vitest/browser/client";
|
|
3
3
|
import { Traces } from "vitest/internal/traces";
|
|
4
4
|
import { page, server, userEvent } from "vitest/browser";
|
|
5
|
-
import { DecodedMap, SpyModule, collectTests, format, getOriginalPosition, getSafeTimers, loadDiffConfig, loadSnapshotSerializers, setupCommonEnv, startCoverageInsideWorker, startTests, stopCoverageInsideWorker, takeCoverageInsideWorker } from "vitest/internal/browser";
|
|
5
|
+
import { DecodedMap, SpyModule, collectTests, format, getOriginalPosition, getSafeTimers, loadDiffConfig, loadSnapshotSerializers, setupCommonEnv, setupEnv, startCoverageInsideWorker, startTests, stopCoverageInsideWorker, takeCoverageInsideWorker } from "vitest/internal/browser";
|
|
6
6
|
import { TestRunner, recordArtifact } from "vitest";
|
|
7
7
|
|
|
8
8
|
//#region \0rolldown/runtime.js
|
|
@@ -106,6 +106,7 @@ expect(${name}).toHaveBeenCalledWith(${formattedParams})
|
|
|
106
106
|
function setupDialogsSpy() {
|
|
107
107
|
globalThis.alert = showPopupWarning("alert", void 0);
|
|
108
108
|
globalThis.confirm = showPopupWarning("confirm", false, true);
|
|
109
|
+
globalThis.print = showPopupWarning("print", void 0);
|
|
109
110
|
globalThis.prompt = showPopupWarning("prompt", null, "your value");
|
|
110
111
|
}
|
|
111
112
|
|
|
@@ -545,7 +546,8 @@ var stackIgnorePatterns = [
|
|
|
545
546
|
/__vitest_test__/,
|
|
546
547
|
/__vitest_browser__/,
|
|
547
548
|
"/@id/__x00__vitest/browser",
|
|
548
|
-
/\/deps\/vitest_
|
|
549
|
+
/\/deps\/vitest_/,
|
|
550
|
+
"/deps/vitest.js"
|
|
549
551
|
];
|
|
550
552
|
var NOW_LENGTH$1 = Date.now().toString().length;
|
|
551
553
|
var REGEXP_VITEST$1 = new RegExp(`vitest=\\d{${NOW_LENGTH$1}}`);
|
|
@@ -638,15 +640,20 @@ function parseStacktrace(stack, options = {}) {
|
|
|
638
640
|
if (options.getUrlId) stack.file = options.getUrlId(stack.file);
|
|
639
641
|
const map = (_options$getSourceMap = options.getSourceMap) === null || _options$getSourceMap === void 0 ? void 0 : _options$getSourceMap.call(options, stack.file);
|
|
640
642
|
if (!map || typeof map !== "object" || !map.version) return shouldFilter(ignoreStackEntries, stack.file) ? null : stack;
|
|
641
|
-
const
|
|
643
|
+
const traceMap = new DecodedMap$1(map, stack.file);
|
|
644
|
+
if (stack.line <= 0 || stack.column <= 0) return stack;
|
|
645
|
+
const position = getOriginalPosition$1(traceMap, {
|
|
646
|
+
line: stack.line,
|
|
647
|
+
column: stack.column - 1
|
|
648
|
+
});
|
|
642
649
|
if (!position) return stack;
|
|
643
650
|
const { line, column, source, name } = position;
|
|
644
651
|
let file = source || stack.file;
|
|
645
|
-
if (
|
|
652
|
+
if (/\/\w:\//.test(file)) file = file.slice(1);
|
|
646
653
|
if (shouldFilter(ignoreStackEntries, file)) return null;
|
|
647
654
|
if (line != null && column != null) return {
|
|
648
655
|
line,
|
|
649
|
-
column,
|
|
656
|
+
column: column + 1,
|
|
650
657
|
file,
|
|
651
658
|
method: name || stack.method
|
|
652
659
|
};
|
|
@@ -833,6 +840,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
833
840
|
_defineProperty(this, "config", void 0);
|
|
834
841
|
_defineProperty(this, "hashMap", browserHashMap);
|
|
835
842
|
_defineProperty(this, "sourceMapCache", /* @__PURE__ */ new Map());
|
|
843
|
+
_defineProperty(this, "sourceMapPrefetches", /* @__PURE__ */ new Map());
|
|
836
844
|
_defineProperty(this, "method", "run");
|
|
837
845
|
_defineProperty(this, "commands", void 0);
|
|
838
846
|
_defineProperty(this, "traces", /* @__PURE__ */ new Map());
|
|
@@ -918,7 +926,8 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
918
926
|
var _super$onBeforeRunSui;
|
|
919
927
|
await Promise.all([(_super$onBeforeRunSui = super.onBeforeRunSuite) === null || _super$onBeforeRunSui === void 0 ? void 0 : _super$onBeforeRunSui.call(this, suite), (async () => {
|
|
920
928
|
if (!("filepath" in suite)) return;
|
|
921
|
-
const map = await rpc$2().getBrowserFileSourceMap(suite.filepath);
|
|
929
|
+
const map = await (this.sourceMapPrefetches.get(suite.filepath) ?? rpc$2().getBrowserFileSourceMap(suite.filepath));
|
|
930
|
+
this.sourceMapPrefetches.delete(suite.filepath);
|
|
922
931
|
this.sourceMapCache.set(suite.filepath, map);
|
|
923
932
|
const snapshotEnvironment = this.config.snapshotOptions.snapshotEnvironment;
|
|
924
933
|
if (snapshotEnvironment instanceof VitestBrowserSnapshotEnvironment) snapshotEnvironment.addSourceMap(suite.filepath, map);
|
|
@@ -930,7 +939,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
930
939
|
if (coverage) await rpc$2().onAfterSuiteRun({
|
|
931
940
|
coverage,
|
|
932
941
|
testFiles: files.map((file) => file.name),
|
|
933
|
-
environment: "
|
|
942
|
+
environment: "client",
|
|
934
943
|
projectName: this.config.name
|
|
935
944
|
});
|
|
936
945
|
});
|
|
@@ -968,7 +977,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
968
977
|
artifact.location = {
|
|
969
978
|
line,
|
|
970
979
|
column: column + 1,
|
|
971
|
-
file:
|
|
980
|
+
file: /\/\w:\//.test(file) ? file.slice(1) : file
|
|
972
981
|
};
|
|
973
982
|
if (artifact.type === "internal:annotation") artifact.annotation.location = artifact.location;
|
|
974
983
|
}
|
|
@@ -995,6 +1004,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
995
1004
|
} catch (err) {
|
|
996
1005
|
throw new Error(`Failed to import test file ${filepath}`, { cause: err });
|
|
997
1006
|
}
|
|
1007
|
+
if (mode === "collect" && !this.sourceMapPrefetches.has(filepath)) this.sourceMapPrefetches.set(filepath, rpc$2().getBrowserFileSourceMap(filepath).catch(() => void 0));
|
|
998
1008
|
});
|
|
999
1009
|
_defineProperty(this, "trace", (name, attributes, cb) => {
|
|
1000
1010
|
const options = typeof attributes === "object" ? { attributes } : {};
|
|
@@ -1002,7 +1012,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
1002
1012
|
});
|
|
1003
1013
|
this.config = options.config;
|
|
1004
1014
|
this.commands = (/* @__PURE__ */ getBrowserState()).commands;
|
|
1005
|
-
this.viteEnvironment = "
|
|
1015
|
+
this.viteEnvironment = "client";
|
|
1006
1016
|
this._otel = (/* @__PURE__ */ getBrowserState()).traces;
|
|
1007
1017
|
}
|
|
1008
1018
|
setMethod(method) {
|
|
@@ -1022,7 +1032,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
1022
1032
|
return;
|
|
1023
1033
|
}
|
|
1024
1034
|
if (shouldTraceView) {
|
|
1025
|
-
(/* @__PURE__ */ getBrowserState()).browserTraceDomSnapshot = await __vitePreload(() => import("./rrweb-snapshot-
|
|
1035
|
+
(/* @__PURE__ */ getBrowserState()).browserTraceDomSnapshot = await __vitePreload(() => import("./rrweb-snapshot-DkFyu2W8.js"), []);
|
|
1026
1036
|
(/* @__PURE__ */ getBrowserState()).browserTraceAttempts.set(test.id, {
|
|
1027
1037
|
retry,
|
|
1028
1038
|
repeats,
|
|
@@ -1933,52 +1943,64 @@ var traces = new Traces({
|
|
|
1933
1943
|
var rootTesterSpan;
|
|
1934
1944
|
(/* @__PURE__ */ getBrowserState()).traces = traces;
|
|
1935
1945
|
channel.addEventListener("message", async (e) => {
|
|
1936
|
-
await client.waitForConnection();
|
|
1937
1946
|
const data = e.data;
|
|
1938
|
-
debug === null || debug === void 0 || debug("event from orchestrator", JSON.stringify(e.data));
|
|
1939
1947
|
if (!isEvent(data)) {
|
|
1948
|
+
await client.waitForConnection();
|
|
1940
1949
|
unhandledError(/* @__PURE__ */ new Error(`Unknown message: ${JSON.stringify(e.data)}`), "Unknown Iframe Message");
|
|
1941
1950
|
return;
|
|
1942
1951
|
}
|
|
1943
1952
|
if (!("iframeId" in data) || data.iframeId !== (/* @__PURE__ */ getBrowserState()).iframeId) return;
|
|
1944
|
-
switch (data.event) {
|
|
1945
|
-
case "execute": {
|
|
1946
|
-
const { method, files, context, concurrencyId, workerId } = data;
|
|
1947
|
-
const state = /* @__PURE__ */ getWorkerState();
|
|
1948
|
-
const parsedContext = parse(context);
|
|
1949
|
-
state.ctx.concurrencyId = concurrencyId;
|
|
1950
|
-
state.ctx.workerId = workerId;
|
|
1951
|
-
state.ctx.providedContext = parsedContext;
|
|
1952
|
-
state.providedContext = parsedContext;
|
|
1953
|
-
state.metaEnv.VITEST_POOL_ID = String(concurrencyId);
|
|
1954
|
-
state.metaEnv.VITEST_WORKER_ID = String(workerId);
|
|
1955
|
-
if (method === "collect") await executeTests("collect", files).catch((err) => unhandledError(err, "Collect Error"));
|
|
1956
|
-
else await executeTests("run", files).catch((err) => unhandledError(err, "Run Error"));
|
|
1957
|
-
break;
|
|
1958
|
-
}
|
|
1959
|
-
case "cleanup":
|
|
1960
|
-
await cleanup().catch((err) => unhandledError(err, "Cleanup Error"));
|
|
1961
|
-
rootTesterSpan === null || rootTesterSpan === void 0 || rootTesterSpan.span.end();
|
|
1962
|
-
await traces.finish();
|
|
1963
|
-
break;
|
|
1964
|
-
case "prepare": {
|
|
1965
|
-
await traces.waitInit();
|
|
1966
|
-
const tracesContext = traces.getContextFromCarrier(data.otelCarrier);
|
|
1967
|
-
traces.recordInitSpan(tracesContext);
|
|
1968
|
-
rootTesterSpan = traces.startContextSpan(`vitest.browser.tester.run`, tracesContext);
|
|
1969
|
-
traces.bind(rootTesterSpan.context);
|
|
1970
|
-
await prepare(data).catch((err) => unhandledError(err, "Prepare Error"));
|
|
1971
|
-
break;
|
|
1972
|
-
}
|
|
1973
|
-
case "viewport:done":
|
|
1974
|
-
case "viewport:fail":
|
|
1975
|
-
case "viewport": break;
|
|
1976
|
-
default: unhandledError(/* @__PURE__ */ new Error(`Unknown event: ${data.event}`), "Unknown Event");
|
|
1977
|
-
}
|
|
1978
1953
|
channel.postMessage({
|
|
1979
|
-
event: `
|
|
1980
|
-
iframeId:
|
|
1954
|
+
event: `ack:${data.event}`,
|
|
1955
|
+
iframeId: data.iframeId,
|
|
1956
|
+
messageId: data.messageId
|
|
1981
1957
|
});
|
|
1958
|
+
await client.waitForConnection();
|
|
1959
|
+
debug === null || debug === void 0 || debug("event from orchestrator", JSON.stringify(e.data));
|
|
1960
|
+
try {
|
|
1961
|
+
switch (data.event) {
|
|
1962
|
+
case "execute": {
|
|
1963
|
+
const { method, files, context, concurrencyId, workerId } = data;
|
|
1964
|
+
const state = /* @__PURE__ */ getWorkerState();
|
|
1965
|
+
const parsedContext = parse(context);
|
|
1966
|
+
state.ctx.concurrencyId = concurrencyId;
|
|
1967
|
+
state.ctx.workerId = workerId;
|
|
1968
|
+
state.ctx.providedContext = parsedContext;
|
|
1969
|
+
state.providedContext = parsedContext;
|
|
1970
|
+
state.metaEnv.VITEST_POOL_ID = String(concurrencyId);
|
|
1971
|
+
state.metaEnv.VITEST_WORKER_ID = String(workerId);
|
|
1972
|
+
if (method === "collect") await executeTests("collect", files).catch((err) => unhandledError(err, "Collect Error"));
|
|
1973
|
+
else await executeTests("run", files).catch((err) => unhandledError(err, "Run Error"));
|
|
1974
|
+
break;
|
|
1975
|
+
}
|
|
1976
|
+
case "cleanup":
|
|
1977
|
+
await cleanup().catch((err) => unhandledError(err, "Cleanup Error"));
|
|
1978
|
+
rootTesterSpan === null || rootTesterSpan === void 0 || rootTesterSpan.span.end();
|
|
1979
|
+
await traces.finish();
|
|
1980
|
+
break;
|
|
1981
|
+
case "prepare": {
|
|
1982
|
+
await traces.waitInit();
|
|
1983
|
+
const tracesContext = traces.getContextFromCarrier(data.otelCarrier);
|
|
1984
|
+
traces.recordInitSpan(tracesContext);
|
|
1985
|
+
rootTesterSpan = traces.startContextSpan(`vitest.browser.tester.run`, tracesContext);
|
|
1986
|
+
traces.bind(rootTesterSpan.context);
|
|
1987
|
+
await prepare(data).catch((err) => unhandledError(err, "Prepare Error"));
|
|
1988
|
+
break;
|
|
1989
|
+
}
|
|
1990
|
+
case "viewport:done":
|
|
1991
|
+
case "viewport:fail":
|
|
1992
|
+
case "viewport": break;
|
|
1993
|
+
default: unhandledError(/* @__PURE__ */ new Error(`Unknown event: ${data.event}`), "Unknown Event");
|
|
1994
|
+
}
|
|
1995
|
+
} catch (error) {
|
|
1996
|
+
await unhandledError(error, "Tester Error");
|
|
1997
|
+
} finally {
|
|
1998
|
+
channel.postMessage({
|
|
1999
|
+
event: `response:${data.event}`,
|
|
2000
|
+
iframeId: data.iframeId,
|
|
2001
|
+
messageId: data.messageId
|
|
2002
|
+
});
|
|
2003
|
+
}
|
|
1982
2004
|
});
|
|
1983
2005
|
var url = new URL(location.href);
|
|
1984
2006
|
var iframeId = url.searchParams.get("iframeId");
|
|
@@ -2055,9 +2077,10 @@ async function prepare(options) {
|
|
|
2055
2077
|
const { config, state } = preparedData;
|
|
2056
2078
|
state.durations.prepare = performance.now() - state.durations.prepare;
|
|
2057
2079
|
debug === null || debug === void 0 || debug("prepare time", state.durations.prepare, "ms");
|
|
2080
|
+
setupEnv(config.env, state.metaEnv);
|
|
2058
2081
|
await Promise.all([
|
|
2059
2082
|
setupCommonEnv(config),
|
|
2060
|
-
startCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.
|
|
2083
|
+
startCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.isolate }),
|
|
2061
2084
|
(async () => {
|
|
2062
2085
|
const VitestIndex = await __vitePreload(() => import("vitest"), []);
|
|
2063
2086
|
Object.defineProperty(window, "__vitest_index__", {
|
|
@@ -2081,7 +2104,7 @@ async function cleanup() {
|
|
|
2081
2104
|
await userEvent.cleanup().catch((error) => unhandledError(error, "Cleanup Error"));
|
|
2082
2105
|
await Promise.all((/* @__PURE__ */ getBrowserState()).cleanups.map((fn) => fn())).catch((error) => unhandledError(error, "Cleanup Error"));
|
|
2083
2106
|
if (contextSwitched) await rpc.wdioSwitchContext("parent").catch((error) => unhandledError(error, "Cleanup Error"));
|
|
2084
|
-
await stopCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.
|
|
2107
|
+
await stopCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.isolate }).catch((error) => {
|
|
2085
2108
|
return unhandledError(error, "Coverage Error");
|
|
2086
2109
|
});
|
|
2087
2110
|
}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
{__VITEST_INJECTOR__}
|
|
27
27
|
{__VITEST_ERROR_CATCHER__}
|
|
28
28
|
{__VITEST_SCRIPTS__}
|
|
29
|
-
<script type="module" crossorigin src="/__vitest_browser__/orchestrator-
|
|
29
|
+
<script type="module" crossorigin src="/__vitest_browser__/orchestrator-Bdv4lWwV.js"></script>
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/__vitest_browser__/defineProperty-WHpdAQXR.js">
|
|
31
31
|
</head>
|
|
32
32
|
<body>
|
|
@@ -5,7 +5,7 @@
|
|
|
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-
|
|
8
|
+
<script type="module" crossorigin src="/__vitest_browser__/tester-CREI5Ivt.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/__vitest_browser__/defineProperty-WHpdAQXR.js">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
package/dist/context.js
CHANGED
|
@@ -245,11 +245,12 @@ function processTimeoutOptions(options_) {
|
|
|
245
245
|
const currentTime = now();
|
|
246
246
|
const endTime = startTime + timeout;
|
|
247
247
|
const remainingTime = Math.floor(endTime - currentTime);
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
//
|
|
252
|
-
|
|
248
|
+
// keep some buffer to process the timeout, but always hand the provider a
|
|
249
|
+
// positive value so it surfaces a descriptive, source-mapped locator error
|
|
250
|
+
// instead of letting the task timer win the race with a generic timeout;
|
|
251
|
+
// the buffer covers the provider->server->client round-trip of the rejection,
|
|
252
|
+
// which can exceed 100ms on loaded CI machines running several browsers
|
|
253
|
+
options_.timeout = Math.max(remainingTime - 250, 1);
|
|
253
254
|
return options_;
|
|
254
255
|
}
|
|
255
256
|
const provider$1 = getBrowserState().provider;
|
package/dist/expect-element.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Snapshots as e,recordArtifact as t,expect as n,chai as r}from"vitest";import{getType as i}from"vitest/internal/browser";import{b as a,e as o,i as s,g as c,n as l,a as u,k as d,c as f,d as ee,f as te,h as ne,j as re,l as ie,m as ae,o as oe,p as se,q as ce,r as le,s as ue,t as p,_ as m,u as h,L as g,v as de,w as fe,x as pe,y as me,z as he,A as ge,B as _e,C as ve,D as ye,E as be}from"./locators-
|
|
1
|
+
import{Snapshots as e,recordArtifact as t,expect as n,chai as r}from"vitest";import{getType as i}from"vitest/internal/browser";import{b as a,e as o,i as s,g as c,n as l,a as u,k as d,c as f,d as ee,f as te,h as ne,j as re,l as ie,m as ae,o as oe,p as se,q as ce,r as le,s as ue,t as p,_ as m,u as h,L as g,v as de,w as fe,x as pe,y as me,z as he,A as ge,B as _e,C as ve,D as ye,E as be}from"./locators-Cxk-0tRh.js";import{server as xe}from"vitest/browser";var Se=Object.defineProperty,Ce=(e,t)=>{let n={};for(var r in e)Se(n,r,{get:e[r],enumerable:!0});return Se(n,Symbol.toStringTag,{value:`Module`}),n};function we(e,t,n={}){let r=Te(e,t,n);if(r.errors.length)throw Error(r.errors[0].message);return r.fragment}function Te(e,t,n={}){let r=new e.LineCounter,i={keepSourceTokens:!0,lineCounter:r,...n},a=e.parseDocument(t,i),o=[],s=e=>[r.linePos(e[0]),r.linePos(e[1])],c=e=>{o.push({message:e.message,range:[r.linePos(e.pos[0]),r.linePos(e.pos[1])]})},l=(t,n)=>{for(let r of n.items){if(r instanceof e.Scalar&&typeof r.value==`string`){let e=v.parse(r,i,o);e&&(t.children=t.children||[],t.children.push(e));continue}if(r instanceof e.YAMLMap){u(t,r);continue}o.push({message:`Sequence items should be strings or maps`,range:s(r.range||n.range)})}},u=(t,n)=>{for(let r of n.items){if(t.children=t.children||[],!(r.key instanceof e.Scalar&&typeof r.key.value==`string`)){o.push({message:`Only string keys are supported`,range:s(r.key.range||n.range)});continue}let a=r.key,c=r.value;if(a.value===`text`){if(!(c instanceof e.Scalar&&typeof c.value==`string`)){o.push({message:`Text value should be a string`,range:s(r.value.range||n.range)});continue}t.children.push({kind:`text`,text:_(c.value)});continue}if(a.value===`/children`){if(!(c instanceof e.Scalar&&typeof c.value==`string`)||c.value!==`contain`&&c.value!==`equal`&&c.value!==`deep-equal`){o.push({message:`Strict value should be "contain", "equal" or "deep-equal"`,range:s(r.value.range||n.range)});continue}t.containerMode=c.value;continue}if(a.value.startsWith(`/`)){if(!(c instanceof e.Scalar&&typeof c.value==`string`)){o.push({message:`Property value should be a string`,range:s(r.value.range||n.range)});continue}t.props=t.props??{},t.props[a.value.slice(1)]=_(c.value);continue}let u=v.parse(a,i,o);if(u){if(c instanceof e.Scalar){let e=typeof c.value;if(e!==`string`&&e!==`number`&&e!==`boolean`){o.push({message:`Node value should be a string or a sequence`,range:s(r.value.range||n.range)});continue}t.children.push({...u,children:[{kind:`text`,text:_(String(c.value))}]});continue}if(c instanceof e.YAMLSeq){t.children.push(u),l(u,c);continue}o.push({message:`Map values should be strings or sequences`,range:s(r.value.range||n.range)})}}},d={kind:`role`,role:`fragment`};return a.errors.forEach(c),o.length?{errors:o,fragment:d}:a.contents?(a.contents instanceof e.YAMLSeq||o.push({message:`Aria snapshot must be a YAML sequence, elements starting with " -"`,range:s(a.contents.range)}),o.length?{errors:o,fragment:d}:(l(d,a.contents),o.length?{errors:o,fragment:Ee}:d.children?.length===1&&(!d.containerMode||d.containerMode===`contain`)?{fragment:d.children[0],errors:[]}:{fragment:d,errors:[]})):{fragment:d,errors:[]}}const Ee={kind:`role`,role:`fragment`};function De(e){return e.replace(/[\u200b\u00ad]/g,``).replace(/[\r\n\s\t]+/g,` `).trim()}function _(e){return{raw:e,normalized:De(e)}}var v=class e{static parse(t,n,r){try{return new e(t.value)._parse()}catch(e){if(e instanceof y){let i=n.prettyErrors===!1?e.message:`${e.message}:\n\n${t.value}\n${` `.repeat(e.pos)}^\n`;return r.push({message:i,range:[n.lineCounter.linePos(t.range[0]),n.lineCounter.linePos(t.range[0]+e.pos)]}),null}throw e}}constructor(e){m(this,`_input`,void 0),m(this,`_pos`,void 0),m(this,`_length`,void 0),this._input=e,this._pos=0,this._length=e.length}_peek(){return this._input[this._pos]||``}_next(){return this._pos<this._length?this._input[this._pos++]:null}_eof(){return this._pos>=this._length}_isWhitespace(){return!this._eof()&&/\s/.test(this._peek())}_skipWhitespace(){for(;this._isWhitespace();)this._pos++}_readIdentifier(e){this._eof()&&this._throwError(`Unexpected end of input when expecting ${e}`);let t=this._pos;for(;!this._eof()&&/[a-zA-Z]/.test(this._peek());)this._pos++;return this._input.slice(t,this._pos)}_readString(){let e=``,t=!1;for(;!this._eof();){let n=this._next();if(t)e+=n,t=!1;else if(n===`\\`)t=!0;else if(n===`"`)return e;else e+=n}this._throwError(`Unterminated string`)}_throwError(e,t=0){throw new y(e,t||this._pos)}_readRegex(){let e=``,t=!1,n=!1;for(;!this._eof();){let r=this._next();if(t)e+=r,t=!1;else if(r===`\\`)t=!0,e+=r;else if(r===`/`&&!n)return{pattern:e};else r===`[`?(n=!0,e+=r):r===`]`&&n?(e+=r,n=!1):e+=r}this._throwError(`Unterminated regex`)}_readStringOrRegex(){let e=this._peek();return e===`"`?(this._next(),De(this._readString())):e===`/`?(this._next(),this._readRegex()):null}_readAttributes(e){let t=this._pos;for(;this._skipWhitespace(),this._peek()===`[`;){this._next(),this._skipWhitespace(),t=this._pos;let n=this._readIdentifier(`attribute`);this._skipWhitespace();let r=``;if(this._peek()===`=`)for(this._next(),this._skipWhitespace(),t=this._pos;this._peek()!==`]`&&!this._isWhitespace()&&!this._eof();)r+=this._next();this._skipWhitespace(),this._peek()!==`]`&&this._throwError(`Expected ]`),this._next(),this._applyAttribute(e,n,r||`true`,t)}}_parse(){this._skipWhitespace();let e=this._readIdentifier(`role`);e===`fragment`&&this._throwError(`Invalid role "fragment"`),this._skipWhitespace();let t={kind:`role`,role:e,name:this._readStringOrRegex()||void 0};return this._readAttributes(t),this._skipWhitespace(),this._eof()||this._throwError(`Unexpected input`),t}_applyAttribute(e,t,n,r){if(t===`checked`){this._assert(n===`true`||n===`false`||n===`mixed`,`Value of "checked" attribute must be a boolean or "mixed"`,r),e.checked=n===`true`?!0:n===`false`?!1:`mixed`;return}if(t===`disabled`){this._assert(n===`true`||n===`false`,`Value of "disabled" attribute must be a boolean`,r),e.disabled=n===`true`;return}if(t===`expanded`){this._assert(n===`true`||n===`false`,`Value of "expanded" attribute must be a boolean`,r),e.expanded=n===`true`;return}if(t===`active`){this._assert(n===`true`||n===`false`,`Value of "active" attribute must be a boolean`,r),e.active=n===`true`;return}if(t===`level`){this._assert(!Number.isNaN(Number(n)),`Value of "level" attribute must be a number`,r),e.level=Number(n);return}if(t===`pressed`){this._assert(n===`true`||n===`false`||n===`mixed`,`Value of "pressed" attribute must be a boolean or "mixed"`,r),e.pressed=n===`true`?!0:n===`false`?!1:`mixed`;return}if(t===`selected`){this._assert(n===`true`||n===`false`,`Value of "selected" attribute must be a boolean`,r),e.selected=n===`true`;return}this._assert(!1,`Unsupported attribute [${t}]`,r)}_assert(e,t,n){e||this._throwError(t||`Assertion error`,n)}},y=class extends Error{constructor(e,t){super(e),m(this,`pos`,void 0),this.pos=t}};function b(e,t){return t?e?typeof t==`string`?e===t:!!e.match(new RegExp(t.pattern)):!1:!0}function x(e,t){if(!t?.normalized)return!0;if(!e)return!1;if(e===t.normalized||e===t.raw)return!0;let n=C(t);return n?!!e.match(n):!1}const S=Symbol(`cachedRegex`);function C(e){if(e[S]!==void 0)return e[S];let{raw:t}=e,n=t.startsWith(`/`)&&t.endsWith(`/`)&&t.length>1,r;try{r=n?new RegExp(t.slice(1,-1)):null}catch{r=null}return e[S]=r,r}function w(e,t,n){if(typeof e==`string`&&t.kind===`text`)return x(e,t.text);if(typeof e!=`object`||!e||t.kind!==`role`||t.role!==`fragment`&&t.role!==e.role||t.checked!==void 0&&t.checked!==e.checked||t.disabled!==void 0&&t.disabled!==e.disabled||t.expanded!==void 0&&t.expanded!==e.expanded||t.level!==void 0&&t.level!==e.level||t.pressed!==void 0&&t.pressed!==e.pressed||t.selected!==void 0&&t.selected!==e.selected||!b(e.name,t.name))return!1;if(t.props){for(let[n,r]of Object.entries(t.props))if(!x(e.props[n]||``,r))return!1}return t.containerMode===`contain`?E(e.children||[],t.children||[]):t.containerMode===`equal`?T(e.children||[],t.children||[],!1):t.containerMode===`deep-equal`||n?T(e.children||[],t.children||[],!0):E(e.children||[],t.children||[])}function T(e,t,n){if(t.length!==e.length)return!1;for(let r=0;r<t.length;++r)if(!w(e[r],t[r],n))return!1;return!0}function E(e,t){if(t.length>e.length)return!1;let n=e.slice(),r=t.slice();for(let e of r){let t=n.shift();for(;t&&!w(t,e,!1);)t=n.shift();if(!t)return!1}return!0}var Oe=Ce({LineCounter:()=>ke,Scalar:()=>D,YAMLError:()=>A,YAMLMap:()=>O,YAMLSeq:()=>k,parseDocument:()=>Ae}),D=class{constructor(e,t=[0,0,0]){m(this,`value`,void 0),m(this,`range`,void 0),this.value=e,this.range=t}},O=class{constructor(e=[0,0,0]){m(this,`items`,void 0),m(this,`range`,void 0),this.items=[],this.range=e}},k=class{constructor(e=[0,0,0]){m(this,`items`,void 0),m(this,`range`,void 0),this.items=[],this.range=e}},ke=class{constructor(){m(this,`lineStarts`,[0])}addNewLine(e){e>this.lineStarts[this.lineStarts.length-1]&&this.lineStarts.push(e)}linePos(e){let t=0,n=this.lineStarts.length-1;for(;t<n;){let r=t+n+1>>1;this.lineStarts[r]<=e?t=r:n=r-1}return{line:t+1,col:e-this.lineStarts[t]+1}}},A=class extends Error{constructor(e,t){super(e),m(this,`pos`,void 0),this.pos=t}};function Ae(e,t={}){let n=t.lineCounter,r=[];if(n)for(let t=0;t<e.length;t++)e[t]===`
|
|
2
2
|
`&&n.addNewLine(t+1);try{return{contents:new je(e,r).parseRoot(),errors:r}}catch(e){if(e instanceof A)return r.push(e),{contents:null,errors:r};throw e}}var je=class{constructor(e,t){m(this,`lines`,void 0),m(this,`pos`,void 0),m(this,`text`,void 0),m(this,`errors`,void 0),this.text=e,this.errors=t,this.lines=[],this.pos=0;let n=0,r=e.split(`
|
|
3
3
|
`);for(let e of r){let t=e.replace(/\r$/,``),r=t.replace(/^\s+/,``),i=t.length-r.length;this.lines.push({indent:i,content:r,offset:n+i,lineOffset:n,raw:t}),n+=e.length+1}for(;this.lines.length>0&&this.lines[this.lines.length-1].content===``;)this.lines.pop()}parseRoot(){if(this.lines.length===0)return null;let e=this.parseNode(0);if(this.skipEmpty(),this.pos<this.lines.length){let e=this.currentLine();this.addError(`Unexpected scalar at node end`,e.offset)}return e}currentLine(){return this.lines[this.pos]}parseNode(e){this.skipEmpty();let t=this.currentLine();return!t||t.indent<e?null:t.content.startsWith(`- `)||t.content===`-`?this.parseSequence(t.indent):this.isMapEntry(t.content)?this.parseMap(t.indent):(this.pos++,this.parseScalarValue(t.content,t.offset,t))}parseSequence(e){let t=this.currentLine(),n=new k([t.offset-t.indent,0,0]),r=t.offset;for(;this.pos<this.lines.length;){this.skipEmpty();let t=this.currentLine();if(!t||t.indent<e)break;if(t.indent>e){this.addError(`Bad indentation of a sequence entry`,t.offset);break}if(!t.content.startsWith(`- `)&&t.content!==`-`)break;let i=t.content===`-`?1:2,a=t.content.slice(i),o=t.offset+i;if(this.pos++,a===``||a.trim()===``){let t=this.parseNode(e+1);t&&(n.items.push(t),r=this.peekLastOffset())}else if(this.isMapEntry(a)){let s=this.parseInlineMap(a,o,e+i,t);n.items.push(s),r=s.range[2]}else{let e=this.parseScalarValue(a,o,t);n.items.push(e),r=e.range[2]}}return n.range[1]=r,n.range[2]=r,n}parseMap(e){let t=this.currentLine(),n=new O([t.offset-t.indent,0,0]),r=t.offset;for(;this.pos<this.lines.length;){this.skipEmpty();let t=this.currentLine();if(!t||t.indent<e)break;if(t.indent>e){this.addError(`Bad indentation of a mapping entry`,t.offset);break}if(!this.isMapEntry(t.content))break;let{key:i,valueStr:a,colonOffset:o,valueOffset:s}=this.splitMapEntry(t.content,t.offset),c=new D(i,[t.offset,t.offset+i.length,o]);this.pos++;let l;l=a===``?this.parseMapValue(e,o):this.parseScalarValue(a.trim(),s,t),n.items.push({key:c,value:l}),r=l?this.getNodeEnd(l):o+1}return n.range[1]=r,n.range[2]=r,n}parseInlineMap(e,t,n,r){let i=new O([t,0,0]),a=t,{key:o,valueStr:s,colonOffset:c,valueOffset:l}=this.splitMapEntry(e,t),u=new D(o,[t,t+o.length,c]),d;for(d=s===``?this.parseMapValue(n,c):this.parseScalarValue(s.trim(),l,r),i.items.push({key:u,value:d}),a=d?this.getNodeEnd(d):c+1;this.pos<this.lines.length;){this.skipEmpty();let e=this.currentLine();if(!e||e.indent<n||e.indent>n||!this.isMapEntry(e.content)||e.content.startsWith(`- `))break;let t=this.splitMapEntry(e.content,e.offset),r=new D(t.key,[e.offset,e.offset+t.key.length,t.colonOffset]);this.pos++;let o;o=t.valueStr===``?this.parseMapValue(n,t.colonOffset):this.parseScalarValue(t.valueStr.trim(),t.valueOffset,e),i.items.push({key:r,value:o}),a=o?this.getNodeEnd(o):t.colonOffset+1}return i.range[1]=a,i.range[2]=a,i}parseMapValue(e,t){this.skipEmpty();let n=this.currentLine();return!n||n.indent<e?new D(null,[t+1,t+1,t+1]):n.indent===e&&(n.content.startsWith(`- `)||n.content===`-`)?this.parseNode(e):n.indent>e?this.parseNode(e+1):new D(null,[t+1,t+1,t+1])}getNodeEnd(e){return e.range[2]}peekLastOffset(){if(this.pos>0&&this.pos<=this.lines.length){let e=this.lines[this.pos-1];return e.lineOffset+e.raw.length}return this.text.length}parseScalarValue(e,t,n){let r=e.trim(),i=t+e.indexOf(r),a=i+r.length,o=n.lineOffset+n.raw.length;return r.startsWith(`"`)?this.parseQuotedScalar(r,i,o):r===`true`||r===`false`?new D(r===`true`,[i,a,o]):r===`null`||r===`~`?new D(null,[i,a,o]):r!==``&&Me(r)?new D(Number(r),[i,a,o]):new D(r,[i,a,o])}parseQuotedScalar(e,t,n){let r=``,i=1;for(;i<e.length;){let a=e[i];if(a===`\\`){if(i++,i>=e.length){this.addError(`Unterminated double-quoted string`,t+i);break}let n=e[i];switch(n){case`n`:r+=`
|
|
4
4
|
`;break;case`t`:r+=` `;break;case`r`:r+=`\r`;break;case`"`:r+=`"`;break;case`\\`:r+=`\\`;break;case`/`:r+=`/`;break;default:r+=n}}else if(a===`"`){let e=t+i+1;return new D(r,[t,e,n])}else r+=a;i++}return this.addError(`Unterminated double-quoted string`,t),new D(r,[t,t+e.length,n])}skipEmpty(){for(;this.pos<this.lines.length&&this.lines[this.pos].content===``;)this.pos++}isMapEntry(e){return this.findMapColon(e)>=0}findMapColon(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let i=e[r];if(n){n=!1;continue}if(i===`\\`&&t){n=!0;continue}if(i===`"`){t=!t;continue}if(!t&&i===`:`&&(r+1>=e.length||e[r+1]===` `))return r}return-1}splitMapEntry(e,t){let n=this.findMapColon(e),r=e.slice(0,n).trim(),i=t+n,a=e.slice(n+1),o=a.trimStart(),s=i+1+(a.length-a.trimStart().length);return r.startsWith(`"`)&&r.endsWith(`"`)?{key:r.slice(1,-1),valueStr:o,colonOffset:i,valueOffset:s}:{key:r,valueStr:o,colonOffset:i,valueOffset:s}}addError(e,t){this.errors.push(new A(e,[t,t+1]))}};function Me(e){return e===``||e===`-`||e===`+`?!1:/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/.test(e)}function j(e){return Ne(e)?`"`+e.replace(/[\\"\x00-\x1f\x7f-\x9f]/g,e=>{switch(e){case`\\`:return`\\\\`;case`"`:return`\\"`;case`\b`:return`\\b`;case`\f`:return`\\f`;case`
|
|
@@ -7,7 +7,7 @@ import{Snapshots as e,recordArtifact as t,expect as n,chai as r}from"vitest";imp
|
|
|
7
7
|
`)}function Ve(e){let t=e.role;return e.name!==void 0&&(t+=` ${ze(e.name)}`),t+=N(e),t}function I(e,t,n){if(e.kind===`text`){n.push(`${t}- text: ${F(e.text)}`);return}let r=Ve(e),i=e.children||[],a=[];if(e.containerMode&&e.containerMode!==`contain`&&a.push(`${t} - /children: ${e.containerMode}`),e.props)for(let[n,r]of Object.entries(e.props))a.push(`${t} - /${n}: ${F(r)}`);if(i.length===0&&a.length===0){n.push(`${t}- ${r}`);return}if(i.length===1&&i[0].kind===`text`&&a.length===0){n.push(`${t}- ${r}: ${F(i[0].text)}`);return}n.push(`${t}- ${r}:`),n.push(...a);for(let e of i)I(e,`${t} `,n)}function He(e,t){let n=e.role===`fragment`?e.children:[e],r=L(t)?t.children??[]:[t],i=L(t)?t.containerMode:void 0,a=qe(n,r,``,i);return a.pass&&i&&i!==`contain`&&a.resolved.unshift(`- /children: ${i}`),{pass:a.pass,resolved:a.resolved.join(`
|
|
8
8
|
`)}}function L(e){return e.kind===`role`&&e.role===`fragment`}function Ue(e){return typeof e==`object`&&!!e&&`pattern`in e}function We(e,t){let n=e.role;return t.name===void 0||(Ue(t.name)&&b(e.name,t.name)?n+=` ${ze(t.name)}`:e.name&&(n+=` ${JSON.stringify(e.name)}`)),t.level!==void 0&&(n+=` [level=${e.level}]`),t.checked!==void 0&&(e.checked===!0?n+=` [checked]`:e.checked===`mixed`&&(n+=` [checked=mixed]`)),t.disabled!==void 0&&e.disabled&&(n+=` [disabled]`),t.expanded!==void 0&&(e.expanded===!0?n+=` [expanded]`:e.expanded===!1&&(n+=` [expanded=false]`)),t.pressed!==void 0&&(e.pressed===!0?n+=` [pressed]`:e.pressed===`mixed`&&(n+=` [pressed=mixed]`)),t.selected!==void 0&&e.selected&&(n+=` [selected]`),n}function Ge(e,t){let n=new Map,r=0;for(let i=0;i<e.length&&r<t.length;i++)w(e[i],t[r],!1)&&(n.set(i,r),r++);return n}function Ke(e,t){let n=new Map,r=new Set;for(let i=0;i<t.length;i++)for(let a=0;a<e.length;a++)if(!r.has(a)&&w(e[a],t[i],!1)){n.set(a,i),r.add(a);break}return n}function R(e,t){let n=[];return typeof e==`string`?n.push(`${t}- text: ${e}`):P(e,t,n),n}function qe(e,t,n,r){if(e.some(e=>typeof e!=`string`&&e.role===`fragment`)||t.some(e=>L(e)))throw Error(`Internal error: fragment wrappers must be unwrapped at matchAriaTree root`);if(r===`equal`||r===`deep-equal`)return Je(e,t,n,r===`deep-equal`);let i=[],a=Ge(e,t);if(t.length!==a.size){let r=Ke(e,t);for(let a=0;a<e.length;a++){let o=r.get(a);o===void 0?i.push(...R(e[a],n)):i.push(...z(e[a],t[o],n))}return{resolved:i,pass:!1}}for(let r=0;r<e.length;r++){let o=a.get(r);o!==void 0&&i.push(...z(e[r],t[o],n))}return{resolved:i,pass:!0}}function Je(e,t,n,r){let i=[],a=e.length===t.length&&e.every((e,n)=>w(e,t[n],r));for(let a=0;a<e.length;a++)a<t.length?i.push(...z(e[a],t[a],n,r)):i.push(...R(e[a],n));return{resolved:i,pass:a}}function z(e,t,n,r=!1){if(typeof e==`string`&&t.kind===`text`)return[`${n}- text: ${x(e,t.text)&&C(t.text)?F(t.text):e}`];if(typeof e==`string`||t.kind===`text`)return R(e,n);let i=We(e,t),a=qe(e.children,t.children||[],`${n} `,t.containerMode??(r?`equal`:`contain`)),o=[];t.containerMode&&t.containerMode!==`contain`&&o.push(`${n} - /children: ${t.containerMode}`);let s=new Set([...Object.keys(e.props),...Object.keys(t.props||{})]);for(let r of s){let i=e.props[r],a=t.props?.[r];if(i!==void 0){let e=(a===void 0||x(i,a))&&a&&C(a)?F(a):i;o.push(`${n} - /${r}: ${e}`)}}let c=[];if(!a.resolved.length&&!o.length)c.push(`${n}- ${i}`);else if(a.resolved.length===1&&a.resolved[0].trimStart().startsWith(`- text: `)&&!o.length){let e=a.resolved[0].trimStart().slice(8);c.push(`${n}- ${i}: ${e}`)}else c.push(`${n}- ${i}:`),c.push(...o),c.push(...a.resolved);return c}function Ye(e){return we(Oe,e)}var Xe=Object.freeze({__proto__:null,generateAriaTree:Pe,matchAriaTree:He,parseAriaTemplate:Ye,renderAriaTemplate:Be,renderAriaTree:Re});h().aria=Xe;const{generateAriaTree:Ze,matchAriaTree:Qe,parseAriaTemplate:$e,renderAriaTemplate:et,renderAriaTree:tt}=Xe,B={name:`aria`,capture(e){if(e instanceof Element)return Ze(e);throw TypeError(`aria adapter expects an Element`)},render(e){return V(tt(e))},parseExpected(e){let t=Error.stackTraceLimit;Error.stackTraceLimit=t+20;try{return $e(e.trim())}finally{Error.stackTraceLimit=t}},match(e,t){let n=Qe(e,t);return n.pass?{pass:!0}:{pass:!1,message:`Accessibility tree does not match expected template`,resolved:V(n.resolved),expected:V(et(t))}}};function V(e){return`\n${e}\n`}const nt={toMatchAriaSnapshot(t){return e.toMatchDomainSnapshot.call(this,B,t)},toMatchAriaInlineSnapshot(t,n){return e.toMatchDomainInlineSnapshot.call(this,B,t,n)}};for(let e of Object.values(nt))Object.assign(e,{__vitest_poll_takeover__:!0});function rt(){return[...d]}function it(e,t,n){return e instanceof g&&(e=e.query()),e==null?null:H(e,t,n)}function H(e,t,n){e instanceof g&&(e=e.element());let r=e?.ownerDocument?.defaultView||window;if(e instanceof r.HTMLElement||e instanceof r.SVGElement)return e;throw new ft(e,t,n)}function at(e,t,n){e instanceof g&&(e=e.element());let r=e.ownerDocument?.defaultView||window;if(e instanceof r.Node)return e;throw new pt(e,t,n)}function U(e,t,n,r,i,a){return[`${t}\n`,`${n}:\n${e.utils.EXPECTED_COLOR(W(lt(e,r),2))}`,`${i}:\n${e.utils.RECEIVED_COLOR(W(lt(e,a),2))}`].join(`
|
|
9
9
|
`)}function W(e,t){return ot(ct(e),t)}function ot(e,t){return e.replace(/^(?!\s*$)/gm,` `.repeat(t))}function st(e){let t=e.match(/^[ \t]*(?=\S)/gm);return t?t.reduce((e,t)=>Math.min(e,t.length),1/0):0}function ct(e){let t=st(e);if(t===0)return e;let n=RegExp(`^[ \\t]{${t}}`,`gm`);return e.replace(n,``)}function lt(e,t){return typeof t==`string`?t:e.utils.stringify(t)}function ut(e,{wordConnector:t=`, `,lastWordConnector:n=` and `}={}){return[e.slice(0,-1).join(t),e.at(-1)].join(e.length>1?n:``)}class dt extends Error{constructor(e,t,n,r){super(),Error.captureStackTrace&&Error.captureStackTrace(this,n);let i=``;try{i=r.utils.printWithType(`Received`,t,r.utils.printReceived)}catch{}this.message=[r.utils.matcherHint(`${r.isNot?`.not`:``}.${n.name}`,`received`,``),``,`${r.utils.RECEIVED_COLOR(`received`)} value must ${e} or a Locator that returns ${e}.`,i].join(`
|
|
10
|
-
`)}}class ft extends dt{constructor(e,t,n){super(`an HTMLElement or an SVGElement`,e,t,n)}}class pt extends dt{constructor(e,t,n){super(`a Node`,e,t,n)}}function G(e){return e instanceof HTMLFormElement?`FORM`:e.tagName.toUpperCase()}function K(e){return G(e)===`INPUT`}function mt(e){if(e)switch(G(e)){case`INPUT`:return gt(e);case`SELECT`:return ht(e);default:return e.value??vt(e)}}function ht({multiple:e,options:t}){let n=[...t].filter(e=>e.selected);if(e)return
|
|
10
|
+
`)}}class ft extends dt{constructor(e,t,n){super(`an HTMLElement or an SVGElement`,e,t,n)}}class pt extends dt{constructor(e,t,n){super(`a Node`,e,t,n)}}function G(e){return e instanceof HTMLFormElement?`FORM`:e.tagName.toUpperCase()}function K(e){return G(e)===`INPUT`}function mt(e){if(e)switch(G(e)){case`INPUT`:return gt(e);case`SELECT`:return ht(e);default:return e.value??vt(e)}}function ht({multiple:e,options:t}){let n=[...t].filter(e=>e.selected);if(e)return Array.from(n,e=>e.value);if(n.length!==0)return n[0].value}function gt(e){switch(e.type){case`number`:return e.value===``?null:Number(e.value);case`checkbox`:return e.checked;default:return e.value}}const _t=[`meter`,`progressbar`,`slider`,`spinbutton`];function vt(e){if(_t.includes(e.getAttribute(`role`)||``))return Number(e.getAttribute(`aria-valuenow`))}function yt(e){return e.replace(/\s+/g,` `).trim()}function bt(e,t){return t instanceof RegExp?t.test(e):e.includes(String(t))}function q(e,t){if(Array.isArray(e)&&Array.isArray(t)){let n=new Set(t);for(let t of new Set(e))if(!n.has(t))return!1;return!0}}const xt=rt();function St(e){let t=H(e,St,this);if(!(K(t)&&[`checkbox`,`radio`].includes(t.type))&&!(xt.includes(c(t)||``)&&[`true`,`false`].includes(t.getAttribute(`aria-checked`)||``)))return{pass:!1,message:()=>`only inputs with type="checkbox" or type="radio" or elements with ${Ct()} and a valid aria-checked attribute can be used with .toBeChecked(). Use .toHaveValue() instead`};let n=f(t)===!0;return{pass:n,message:()=>{let e=n?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeChecked`,`element`,``),``,`Received element ${e} checked:`,` ${this.utils.printReceived(t.cloneNode(!1))}`].join(`
|
|
11
11
|
`)}}}function Ct(){return ut(xt.map(e=>`role="${e}"`),{lastWordConnector:` or `})}function wt(e){let t=H(e,wt,this);return{pass:Tt(t),message:()=>[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeEmptyDOMElement`,`element`,``),``,`Received:`,` ${this.utils.printReceived(t.innerHTML)}`].join(`
|
|
12
12
|
`)}}function Tt(e){return[...e.childNodes].filter(e=>e.nodeType!==Node.COMMENT_NODE).length===0}function Et(e){let t=H(e,Et,this),n=Ot(t);return{pass:n,message:()=>{let e=n?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeDisabled`,`element`,``),``,`Received element ${e} disabled:`,` ${this.utils.printReceived(t.cloneNode(!1))}`].join(`
|
|
13
13
|
`)}}}function Dt(e){let t=H(e,Dt,this),n=Ot(t);return{pass:!n,message:()=>{let e=n?`is not`:`is`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeEnabled`,`element`,``),``,`Received element ${e} enabled:`,` ${this.utils.printReceived(t.cloneNode(!1))}`].join(`
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ResolvedConfig, BrowserServerFactory, BrowserCommand, BrowserProviderOption } from 'vitest/node';
|
|
1
|
+
import { TestProject, ResolvedConfig, BrowserServerFactory, BrowserCommand, BrowserProviderOption } from 'vitest/node';
|
|
2
2
|
import { ScreenshotMatcherOptions, NonStandardScreenshotComparators, ScreenshotComparatorRegistry } from '@vitest/browser/context';
|
|
3
3
|
|
|
4
4
|
interface BaseMetadata {
|
|
@@ -61,6 +61,8 @@ declare function parseKeyDef(text: string): {
|
|
|
61
61
|
repeat: number;
|
|
62
62
|
}[];
|
|
63
63
|
declare function resolveScreenshotPath(testPath: string, name: string, config: ResolvedConfig, customPath: string | undefined): string;
|
|
64
|
+
declare function assertBrowserFileAccess(project: TestProject, path: string): void;
|
|
65
|
+
declare function assertBrowserApiWrite(project: TestProject, path: string): void;
|
|
64
66
|
|
|
65
67
|
interface SerializedLocator {
|
|
66
68
|
selector: string;
|
|
@@ -68,10 +70,16 @@ interface SerializedLocator {
|
|
|
68
70
|
}
|
|
69
71
|
declare function defineBrowserCommand<T extends unknown[]>(fn: BrowserCommand<T>): BrowserCommand<T>;
|
|
70
72
|
|
|
73
|
+
/**
|
|
74
|
+
* The browser provider's `serverFactory`. Returns a `BrowserServerContribution`
|
|
75
|
+
* that Vitest core uses to build the SINGLE Vite server shared by `project.vite`
|
|
76
|
+
* and `project.browser.vite`. This factory does NOT create a server (core does);
|
|
77
|
+
* it only contributes config, plugins, the parent factory, and the RPC setup.
|
|
78
|
+
*/
|
|
71
79
|
declare const createBrowserServer: BrowserServerFactory;
|
|
72
80
|
declare function defineBrowserProvider<T extends object = object>(options: Omit<BrowserProviderOption<T>, "serverFactory" | "options"> & {
|
|
73
81
|
options?: T;
|
|
74
82
|
}): BrowserProviderOption;
|
|
75
83
|
|
|
76
|
-
export { createBrowserServer, defineBrowserCommand, defineBrowserProvider, parseKeyDef, resolveScreenshotPath };
|
|
84
|
+
export { assertBrowserApiWrite, assertBrowserFileAccess, createBrowserServer, defineBrowserCommand, defineBrowserProvider, parseKeyDef, resolveScreenshotPath };
|
|
77
85
|
export type { CustomComparatorsRegistry, SerializedLocator };
|