@vitest/browser 4.1.5 → 5.0.0-beta.1
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/context.d.ts +18 -0
- package/dist/client/.vite/manifest.json +15 -6
- package/dist/client/__vitest__/assets/index-BmuVn2L3.js +136 -0
- package/dist/client/__vitest__/assets/index-CxYquQyv.css +1 -0
- package/dist/client/__vitest__/index.html +2 -2
- package/dist/client/__vitest_browser__/{orchestrator-DM4mHHP0.js → orchestrator-pTEf6o0n.js} +25 -29
- package/dist/client/__vitest_browser__/rrweb-snapshot-xhvrgOHx.js +5476 -0
- package/dist/client/__vitest_browser__/{tester-Bf18VQr2.js → tester-CIKiUsoz.js} +156 -13
- package/dist/client/__vitest_browser__/{utils-DmkAiRYk.js → utils-BYUpz6v6.js} +132 -597
- package/dist/client/orchestrator.html +2 -2
- package/dist/client/tester/tester.html +2 -2
- package/dist/client/tester/trace.d.ts +53 -0
- package/dist/client.js +1 -0
- package/dist/context.js +148 -7
- package/dist/expect-element.js +30 -30
- package/dist/index-BlWsE3ij.js +5 -0
- package/dist/index.js +22 -1
- package/dist/locators.js +1 -1
- package/dist/state.js +1 -0
- package/dist/vendor-types.d.ts +131 -0
- package/dist/vendor-types.ts +1 -0
- package/package.json +11 -6
- package/dist/client/__vitest__/assets/index-BPQdrqGZ.js +0 -94
- package/dist/client/__vitest__/assets/index-Da0hb3oU.css +0 -1
- package/dist/index-D8jtZoIM.js +0 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { c as resolve,
|
|
1
|
+
import { c as resolve, g as getBrowserState, n as now$1, m as moduleRunner, d as getWorkerState, e as getTestName, a as getConfig } from "./utils-BYUpz6v6.js";
|
|
2
2
|
import { onCancel, globalChannel, channel, client } from "@vitest/browser/client";
|
|
3
3
|
import { userEvent, page, server } from "vitest/browser";
|
|
4
|
-
import { getSafeTimers, DecodedMap as DecodedMap$1, getOriginalPosition as getOriginalPosition$1, loadDiffConfig, loadSnapshotSerializers, takeCoverageInsideWorker,
|
|
4
|
+
import { getSafeTimers, DecodedMap as DecodedMap$1, getOriginalPosition as getOriginalPosition$1, loadDiffConfig, loadSnapshotSerializers, takeCoverageInsideWorker, format, Traces, setupCommonEnv, startCoverageInsideWorker, stopCoverageInsideWorker, startTests, collectTests, SpyModule } from "vitest/internal/browser";
|
|
5
5
|
import { TestRunner, BenchmarkRunner, recordArtifact } from "vitest";
|
|
6
6
|
const scriptRel = "modulepreload";
|
|
7
7
|
const assetsURL = function(dep) {
|
|
@@ -826,6 +826,101 @@ class VitestBrowserSnapshotEnvironment {
|
|
|
826
826
|
function rpc$1() {
|
|
827
827
|
return globalThis.__vitest_worker__.rpc;
|
|
828
828
|
}
|
|
829
|
+
const PSEUDO_CLASS_NAMES = [
|
|
830
|
+
":hover",
|
|
831
|
+
":active",
|
|
832
|
+
":focus",
|
|
833
|
+
":focus-visible",
|
|
834
|
+
":focus-within"
|
|
835
|
+
];
|
|
836
|
+
function getBrowserTraceState() {
|
|
837
|
+
var _a;
|
|
838
|
+
return (_a = getBrowserState()).browserTraceState ?? (_a.browserTraceState = {});
|
|
839
|
+
}
|
|
840
|
+
function getTraceStateKey(testId, repeats, retry) {
|
|
841
|
+
return `${testId}:${repeats}:${retry}`;
|
|
842
|
+
}
|
|
843
|
+
function recordBrowserTraceEntry(task, options) {
|
|
844
|
+
var _a;
|
|
845
|
+
if ((_a = options.selector) == null ? void 0 : _a.startsWith("html >")) {
|
|
846
|
+
options.selector = options.selector.slice(6);
|
|
847
|
+
}
|
|
848
|
+
const attemptInfo = getBrowserState().browserTraceAttempts.get(task.id);
|
|
849
|
+
const relativeStartTime = (options.startTime ?? now$1()) - attemptInfo.startTime;
|
|
850
|
+
const snapshot = takeSnapshot(options.selector);
|
|
851
|
+
const entry = {
|
|
852
|
+
...options,
|
|
853
|
+
startTime: relativeStartTime,
|
|
854
|
+
snapshot
|
|
855
|
+
};
|
|
856
|
+
const { retry, repeats } = attemptInfo;
|
|
857
|
+
const { recordCanvas } = getBrowserState().config.browser.traceView;
|
|
858
|
+
const state = getBrowserTraceState();
|
|
859
|
+
const traceKey = getTraceStateKey(task.id, repeats, retry);
|
|
860
|
+
state[traceKey] ?? (state[traceKey] = { retry, repeats, recordCanvas, entries: [] });
|
|
861
|
+
state[traceKey].entries.push(entry);
|
|
862
|
+
}
|
|
863
|
+
function takeSnapshot(selector) {
|
|
864
|
+
const { snapshot, createMirror } = getBrowserState().browserTraceDomSnapshot;
|
|
865
|
+
const traceView = getBrowserState().config.browser.traceView;
|
|
866
|
+
const engine = getBrowserState().selectorEngine;
|
|
867
|
+
const mirror = createMirror();
|
|
868
|
+
const serialized = snapshot(document, {
|
|
869
|
+
mirror,
|
|
870
|
+
inlineImages: traceView.inlineImages,
|
|
871
|
+
recordCanvas: traceView.recordCanvas
|
|
872
|
+
});
|
|
873
|
+
const result = {
|
|
874
|
+
serialized,
|
|
875
|
+
viewport: {
|
|
876
|
+
width: window.innerWidth,
|
|
877
|
+
height: window.innerHeight
|
|
878
|
+
},
|
|
879
|
+
scroll: {
|
|
880
|
+
x: window.scrollX,
|
|
881
|
+
y: window.scrollY
|
|
882
|
+
},
|
|
883
|
+
pseudoClassIds: {}
|
|
884
|
+
};
|
|
885
|
+
for (const className of PSEUDO_CLASS_NAMES) {
|
|
886
|
+
const elements = document.querySelectorAll(className);
|
|
887
|
+
const ids = Array.from(elements, (el) => mirror.getId(el)).filter((id) => id !== -1);
|
|
888
|
+
result.pseudoClassIds[className] = ids;
|
|
889
|
+
}
|
|
890
|
+
if (selector) {
|
|
891
|
+
try {
|
|
892
|
+
const el = engine.querySelector(
|
|
893
|
+
engine.parseSelector(selector),
|
|
894
|
+
document.documentElement,
|
|
895
|
+
false
|
|
896
|
+
);
|
|
897
|
+
if (!el) {
|
|
898
|
+
result.selectorResolution = "missing";
|
|
899
|
+
} else {
|
|
900
|
+
const id = mirror.getId(el);
|
|
901
|
+
if (id !== -1) {
|
|
902
|
+
result.selectorId = id;
|
|
903
|
+
result.selectorResolution = "matched";
|
|
904
|
+
} else {
|
|
905
|
+
result.selectorResolution = "missing";
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
} catch (error) {
|
|
909
|
+
result.selectorResolution = "error";
|
|
910
|
+
result.selectorError = error instanceof Error ? error.message : String(error);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
return result;
|
|
914
|
+
}
|
|
915
|
+
function getBrowserTrace(testId, repeats, retry) {
|
|
916
|
+
const state = getBrowserTraceState();
|
|
917
|
+
const traceKey = getTraceStateKey(testId, repeats, retry);
|
|
918
|
+
const result = state[traceKey];
|
|
919
|
+
if (result) {
|
|
920
|
+
delete state[traceKey];
|
|
921
|
+
return result;
|
|
922
|
+
}
|
|
923
|
+
}
|
|
829
924
|
const browserHashMap = /* @__PURE__ */ new Map();
|
|
830
925
|
function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
|
|
831
926
|
return class BrowserTestRunner extends runnerClass {
|
|
@@ -854,6 +949,18 @@ function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
|
|
|
854
949
|
const test = args[0];
|
|
855
950
|
const { retry, repeats } = args[1];
|
|
856
951
|
const shouldTrace = trace !== "off" && !(trace === "on-all-retries" && retry === 0) && !(trace === "on-first-retry" && retry !== 1);
|
|
952
|
+
const shouldTraceView = this.config.browser.traceView.enabled;
|
|
953
|
+
if (!shouldTraceView && !shouldTrace) {
|
|
954
|
+
getBrowserState().activeTraceTaskIds.delete(test.id);
|
|
955
|
+
getBrowserState().browserTraceAttempts.delete(test.id);
|
|
956
|
+
return;
|
|
957
|
+
}
|
|
958
|
+
if (shouldTraceView) {
|
|
959
|
+
getBrowserState().browserTraceDomSnapshot = await __vitePreload(() => import("./rrweb-snapshot-xhvrgOHx.js"), true ? [] : void 0);
|
|
960
|
+
getBrowserState().browserTraceAttempts.set(test.id, { retry, repeats, startTime: now$1() });
|
|
961
|
+
} else {
|
|
962
|
+
getBrowserState().browserTraceAttempts.delete(test.id);
|
|
963
|
+
}
|
|
857
964
|
if (!shouldTrace) {
|
|
858
965
|
getBrowserState().activeTraceTaskIds.delete(test.id);
|
|
859
966
|
return;
|
|
@@ -873,13 +980,34 @@ function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
|
|
|
873
980
|
);
|
|
874
981
|
};
|
|
875
982
|
onAfterRetryTask = async (test, { retry, repeats }) => {
|
|
876
|
-
var _a, _b, _c;
|
|
877
|
-
|
|
983
|
+
var _a, _b, _c, _d, _e, _f;
|
|
984
|
+
const hasActiveTraceView = getBrowserState().browserTraceAttempts.has(test.id);
|
|
985
|
+
if (hasActiveTraceView) {
|
|
986
|
+
const status = (_a = test.result) == null ? void 0 : _a.state;
|
|
987
|
+
const stack = status === "fail" ? (_c = (_b = test.result) == null ? void 0 : _b.errors) == null ? void 0 : _c[0].stack : void 0;
|
|
988
|
+
const location2 = test.location ? { ...test.location, file: test.file.filepath } : void 0;
|
|
989
|
+
recordBrowserTraceEntry(test, {
|
|
990
|
+
name: `vitest:onAfterRetryTask`,
|
|
991
|
+
kind: "lifecycle",
|
|
992
|
+
...status === "pass" || status === "fail" ? { status } : {},
|
|
993
|
+
...stack ? { stack } : location2 ? { location: location2 } : {}
|
|
994
|
+
});
|
|
995
|
+
const traceData = getBrowserTrace(test.id, repeats, retry);
|
|
996
|
+
if (traceData) {
|
|
997
|
+
await this.commands.triggerCommand(
|
|
998
|
+
"__vitest_recordBrowserTrace",
|
|
999
|
+
[{ testId: test.id, data: traceData }]
|
|
1000
|
+
);
|
|
1001
|
+
}
|
|
1002
|
+
getBrowserState().browserTraceAttempts.delete(test.id);
|
|
1003
|
+
}
|
|
1004
|
+
const hasActiveTrace = getBrowserState().activeTraceTaskIds.has(test.id);
|
|
1005
|
+
if (!hasActiveTrace) {
|
|
878
1006
|
return;
|
|
879
1007
|
}
|
|
880
1008
|
await this.commands.triggerCommand("__vitest_markTrace", [{
|
|
881
|
-
name: `onAfterRetryTask [${(
|
|
882
|
-
stack: (
|
|
1009
|
+
name: `onAfterRetryTask [${(_d = test.result) == null ? void 0 : _d.state}]`,
|
|
1010
|
+
stack: (_f = (_e = test.result) == null ? void 0 : _e.errors) == null ? void 0 : _f[0].stack
|
|
883
1011
|
}]);
|
|
884
1012
|
const name = getTraceName(test, retry, repeats);
|
|
885
1013
|
if (!this.traces.has(test.id)) {
|
|
@@ -1153,7 +1281,7 @@ function setupConsoleLogSpy() {
|
|
|
1153
1281
|
console$1.warn = stderr(warn);
|
|
1154
1282
|
console$1.dir = (item, options) => {
|
|
1155
1283
|
dir(item, options);
|
|
1156
|
-
sendLog("stdout",
|
|
1284
|
+
sendLog("stdout", processLog([item]));
|
|
1157
1285
|
};
|
|
1158
1286
|
console$1.dirxml = (...args) => {
|
|
1159
1287
|
dirxml(...args);
|
|
@@ -1224,7 +1352,7 @@ function stderr(base) {
|
|
|
1224
1352
|
};
|
|
1225
1353
|
}
|
|
1226
1354
|
function processLog(args) {
|
|
1227
|
-
return
|
|
1355
|
+
return format(args, { multiline: true });
|
|
1228
1356
|
}
|
|
1229
1357
|
function sendLog(type, content, disableStack) {
|
|
1230
1358
|
var _a, _b, _c;
|
|
@@ -2024,9 +2152,10 @@ class CommandsManager {
|
|
|
2024
2152
|
const { sessionId, traces: traces2 } = getBrowserState();
|
|
2025
2153
|
const filepath = state.filepath || ((_b = (_a = state.current) == null ? void 0 : _a.file) == null ? void 0 : _b.filepath);
|
|
2026
2154
|
args = args.filter((arg) => arg !== void 0);
|
|
2027
|
-
const actionTraceGroupName = ACTION_TRACE_COMMANDS.has(command) ? command : void 0;
|
|
2155
|
+
const actionTraceGroupName = ACTION_TRACE_COMMANDS.has(command) ? `vitest:${command.slice("__vitest_".length)}` : void 0;
|
|
2028
2156
|
const currentTest = getWorkerState().current;
|
|
2029
|
-
const
|
|
2157
|
+
const hasActiveTrace = !!actionTraceGroupName && !!currentTest && getBrowserState().activeTraceTaskIds.has(currentTest.id);
|
|
2158
|
+
const hasActiveTraceView = !!actionTraceGroupName && !!currentTest && getBrowserState().browserTraceAttempts.has(currentTest.id);
|
|
2030
2159
|
if (this._listeners.length) {
|
|
2031
2160
|
await Promise.all(this._listeners.map((listener) => listener(command, args)));
|
|
2032
2161
|
}
|
|
@@ -2040,7 +2169,7 @@ class CommandsManager {
|
|
|
2040
2169
|
},
|
|
2041
2170
|
async () => {
|
|
2042
2171
|
var _a2;
|
|
2043
|
-
if (
|
|
2172
|
+
if (hasActiveTrace) {
|
|
2044
2173
|
await rpc2.triggerCommand(
|
|
2045
2174
|
sessionId,
|
|
2046
2175
|
"__vitest_groupTraceStart",
|
|
@@ -2051,15 +2180,29 @@ class CommandsManager {
|
|
|
2051
2180
|
}]
|
|
2052
2181
|
);
|
|
2053
2182
|
}
|
|
2183
|
+
let status = "pass";
|
|
2184
|
+
const startTime = now$1();
|
|
2054
2185
|
try {
|
|
2055
2186
|
return await rpc2.triggerCommand(sessionId, command, filepath, args);
|
|
2056
2187
|
} catch (err) {
|
|
2188
|
+
status = "fail";
|
|
2057
2189
|
clientError.message = err.message;
|
|
2058
2190
|
clientError.name = err.name;
|
|
2059
2191
|
clientError.stack = (_a2 = clientError.stack) == null ? void 0 : _a2.replace(clientError.message, err.message);
|
|
2060
2192
|
throw clientError;
|
|
2061
2193
|
} finally {
|
|
2062
|
-
if (
|
|
2194
|
+
if (hasActiveTraceView) {
|
|
2195
|
+
recordBrowserTraceEntry(currentTest, {
|
|
2196
|
+
name: actionTraceGroupName,
|
|
2197
|
+
kind: "action",
|
|
2198
|
+
status,
|
|
2199
|
+
startTime,
|
|
2200
|
+
duration: now$1() - startTime,
|
|
2201
|
+
selector: typeof args[0] === "string" ? args[0] : void 0,
|
|
2202
|
+
stack: clientError.stack
|
|
2203
|
+
});
|
|
2204
|
+
}
|
|
2205
|
+
if (hasActiveTrace) {
|
|
2063
2206
|
await rpc2.triggerCommand(
|
|
2064
2207
|
sessionId,
|
|
2065
2208
|
"__vitest_groupTraceEnd",
|
|
@@ -2072,7 +2215,6 @@ class CommandsManager {
|
|
|
2072
2215
|
);
|
|
2073
2216
|
}
|
|
2074
2217
|
}
|
|
2075
|
-
globalThis.performance ? globalThis.performance.now.bind(globalThis.performance) : Date.now;
|
|
2076
2218
|
getBrowserState().provider;
|
|
2077
2219
|
const debugVar = getConfig().env.VITEST_BROWSER_DEBUG;
|
|
2078
2220
|
const debug = debugVar && debugVar !== "false" ? (...args) => {
|
|
@@ -2150,6 +2292,7 @@ const iframeId = url.searchParams.get("iframeId");
|
|
|
2150
2292
|
const commands = new CommandsManager();
|
|
2151
2293
|
getBrowserState().commands = commands;
|
|
2152
2294
|
getBrowserState().activeTraceTaskIds = /* @__PURE__ */ new Set();
|
|
2295
|
+
getBrowserState().browserTraceAttempts = /* @__PURE__ */ new Map();
|
|
2153
2296
|
getBrowserState().iframeId = iframeId;
|
|
2154
2297
|
let contextSwitched = false;
|
|
2155
2298
|
async function prepareTestEnvironment(options) {
|