@vitest/browser 3.0.6 → 3.0.8
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-BX_iUIjH.js → index-BAYvVM30.js} +25 -25
- package/dist/client/__vitest__/index.html +1 -1
- package/dist/client/__vitest_browser__/{orchestrator-BR1Ueh0Q.js → orchestrator-C0dFtnHa.js} +2 -2
- package/dist/client/__vitest_browser__/{tester-oUsZBBvV.js → tester-CHxkAhrF.js} +58 -17
- package/dist/client/__vitest_browser__/{utils-Owv5OOOf.js → utils-CBFLDkwI.js} +23 -0
- package/dist/client/error-catcher.js +10 -0
- package/dist/client/orchestrator.html +2 -2
- package/dist/client/tester/tester.html +2 -2
- package/dist/context.js +5 -8
- package/dist/{index-D-kNWeee.js → index-fqTesRIH.js} +2 -13
- package/dist/index.d.ts +3 -0
- package/dist/index.js +60 -23
- package/dist/locators/index.d.ts +0 -3
- 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.js +1 -1
- package/dist/{webdriver-kh_HHy0p.js → webdriver-C5-VI7VH.js} +17 -8
- package/dummy.js +0 -0
- package/package.json +16 -15
- package/providers/webdriverio.d.ts +4 -2
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
})();
|
|
24
24
|
</script>
|
|
25
25
|
<!-- !LOAD_METADATA! -->
|
|
26
|
-
<script type="module" src="./assets/index-
|
|
26
|
+
<script type="module" src="./assets/index-BAYvVM30.js"></script>
|
|
27
27
|
<link rel="stylesheet" href="./assets/index-CV9H8iCm.css">
|
|
28
28
|
</head>
|
|
29
29
|
<body>
|
package/dist/client/__vitest_browser__/{orchestrator-BR1Ueh0Q.js → orchestrator-C0dFtnHa.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
import { g as getBrowserState, a as getConfig, r as relative } from "./utils-
|
|
4
|
+
import { g as getBrowserState, a as getConfig, r as relative } from "./utils-CBFLDkwI.js";
|
|
5
5
|
import { client, channel, globalChannel } from "@vitest/browser/client";
|
|
6
6
|
function generateHash(str) {
|
|
7
7
|
let hash = 0;
|
|
@@ -54,7 +54,7 @@ class IframeOrchestrator {
|
|
|
54
54
|
const { width, height } = config.browser.viewport;
|
|
55
55
|
this.iframes.forEach((iframe) => iframe.remove());
|
|
56
56
|
this.iframes.clear();
|
|
57
|
-
if (config.isolate === false) {
|
|
57
|
+
if (config.browser.isolate === false) {
|
|
58
58
|
debug("create iframe", ID_ALL);
|
|
59
59
|
const iframe = this.createIframe(container, ID_ALL);
|
|
60
60
|
await setIframeViewport(iframe, width, height);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
import { a as getConfig, g as getBrowserState, b as resolve, e as executor, c as getWorkerState } from "./utils-
|
|
4
|
+
import { a as getConfig, g as getBrowserState, b as resolve, e as executor, c as getWorkerState, C as CommandsManager } from "./utils-CBFLDkwI.js";
|
|
5
5
|
import { globalChannel, client, onCancel, channel } from "@vitest/browser/client";
|
|
6
|
-
import { userEvent, page } from "@vitest/browser/context";
|
|
6
|
+
import { userEvent, page, server } from "@vitest/browser/context";
|
|
7
7
|
import { loadDiffConfig, loadSnapshotSerializers, takeCoverageInsideWorker, setupCommonEnv, startCoverageInsideWorker, startTests, collectTests, stopCoverageInsideWorker, SpyModule } from "vitest/browser";
|
|
8
8
|
import { expect, chai } from "vitest";
|
|
9
9
|
import { getSafeTimers, stringify, format, TraceMap, originalPositionFor } from "vitest/utils";
|
|
@@ -13045,6 +13045,11 @@ ${stack}`, true);
|
|
|
13045
13045
|
function stdout(base) {
|
|
13046
13046
|
return (...args) => {
|
|
13047
13047
|
base(...args);
|
|
13048
|
+
if (args[0] === "[WDIO]") {
|
|
13049
|
+
if (args[1] === "newShadowRoot" || args[1] === "removeShadowRoot") {
|
|
13050
|
+
return;
|
|
13051
|
+
}
|
|
13052
|
+
}
|
|
13048
13053
|
sendLog("stdout", processLog(args));
|
|
13049
13054
|
};
|
|
13050
13055
|
}
|
|
@@ -15020,7 +15025,9 @@ function extractLocation(urlLike) {
|
|
|
15020
15025
|
}
|
|
15021
15026
|
if (url2.startsWith("http:") || url2.startsWith("https:")) {
|
|
15022
15027
|
const urlObj = new URL(url2);
|
|
15023
|
-
|
|
15028
|
+
urlObj.searchParams.delete("import");
|
|
15029
|
+
urlObj.searchParams.delete("browserv");
|
|
15030
|
+
url2 = urlObj.pathname + urlObj.hash + urlObj.search;
|
|
15024
15031
|
}
|
|
15025
15032
|
if (url2.startsWith("/@fs/")) {
|
|
15026
15033
|
const isWindows = /^\/@fs\/[a-zA-Z]:\//.test(url2);
|
|
@@ -15105,28 +15112,40 @@ function createStackString(stacks) {
|
|
|
15105
15112
|
}
|
|
15106
15113
|
function parseStacktrace(stack, options = {}) {
|
|
15107
15114
|
const { ignoreStackEntries = stackIgnorePatterns } = options;
|
|
15108
|
-
|
|
15109
|
-
if (ignoreStackEntries.length) {
|
|
15110
|
-
stacks = stacks.filter(
|
|
15111
|
-
(stack2) => !ignoreStackEntries.some((p) => stack2.file.match(p))
|
|
15112
|
-
);
|
|
15113
|
-
}
|
|
15115
|
+
const stacks = !CHROME_IE_STACK_REGEXP.test(stack) ? parseFFOrSafariStackTrace(stack) : parseV8Stacktrace(stack);
|
|
15114
15116
|
return stacks.map((stack2) => {
|
|
15115
15117
|
var _a;
|
|
15116
|
-
if (options.
|
|
15117
|
-
stack2.file = options.
|
|
15118
|
+
if (options.getUrlId) {
|
|
15119
|
+
stack2.file = options.getUrlId(stack2.file);
|
|
15118
15120
|
}
|
|
15119
15121
|
const map = (_a = options.getSourceMap) == null ? void 0 : _a.call(options, stack2.file);
|
|
15120
15122
|
if (!map || typeof map !== "object" || !map.version) {
|
|
15121
|
-
return stack2;
|
|
15123
|
+
return shouldFilter(ignoreStackEntries, stack2.file) ? null : stack2;
|
|
15122
15124
|
}
|
|
15123
15125
|
const traceMap = new traceMapping_umdExports.TraceMap(map);
|
|
15124
|
-
const { line, column } = traceMapping_umdExports.originalPositionFor(traceMap, stack2);
|
|
15126
|
+
const { line, column, source: source2, name } = traceMapping_umdExports.originalPositionFor(traceMap, stack2);
|
|
15127
|
+
let file = stack2.file;
|
|
15128
|
+
if (source2) {
|
|
15129
|
+
const fileUrl = stack2.file.startsWith("file://") ? stack2.file : `file://${stack2.file}`;
|
|
15130
|
+
const sourceRootUrl = map.sourceRoot ? new URL(map.sourceRoot, fileUrl) : fileUrl;
|
|
15131
|
+
file = new URL(source2, sourceRootUrl).pathname;
|
|
15132
|
+
}
|
|
15133
|
+
if (shouldFilter(ignoreStackEntries, file)) {
|
|
15134
|
+
return null;
|
|
15135
|
+
}
|
|
15125
15136
|
if (line != null && column != null) {
|
|
15126
|
-
return {
|
|
15137
|
+
return {
|
|
15138
|
+
line,
|
|
15139
|
+
column,
|
|
15140
|
+
file,
|
|
15141
|
+
method: name || stack2.method
|
|
15142
|
+
};
|
|
15127
15143
|
}
|
|
15128
15144
|
return stack2;
|
|
15129
|
-
});
|
|
15145
|
+
}).filter((s) => s != null);
|
|
15146
|
+
}
|
|
15147
|
+
function shouldFilter(ignoreStackEntries, file) {
|
|
15148
|
+
return ignoreStackEntries.some((p) => file.match(p));
|
|
15130
15149
|
}
|
|
15131
15150
|
function parseFFOrSafariStackTrace(stack) {
|
|
15132
15151
|
return stack.split("\n").map((line) => parseSingleFFOrSafariStack(line)).filter(notNullish);
|
|
@@ -15366,6 +15385,7 @@ async function prepareTestEnvironment(files) {
|
|
|
15366
15385
|
state.ctx.files = files;
|
|
15367
15386
|
state.onCancel = onCancel;
|
|
15368
15387
|
state.rpc = rpc2;
|
|
15388
|
+
getBrowserState().commands = new CommandsManager();
|
|
15369
15389
|
const interceptor = createModuleMockerInterceptor();
|
|
15370
15390
|
const mocker = new VitestBrowserClientMocker(
|
|
15371
15391
|
interceptor,
|
|
@@ -15394,7 +15414,9 @@ async function prepareTestEnvironment(files) {
|
|
|
15394
15414
|
return {
|
|
15395
15415
|
runner,
|
|
15396
15416
|
config,
|
|
15397
|
-
state
|
|
15417
|
+
state,
|
|
15418
|
+
rpc: rpc2,
|
|
15419
|
+
commands: getBrowserState().commands
|
|
15398
15420
|
};
|
|
15399
15421
|
}
|
|
15400
15422
|
function done(files) {
|
|
@@ -15425,9 +15447,25 @@ async function executeTests(method, files) {
|
|
|
15425
15447
|
return;
|
|
15426
15448
|
}
|
|
15427
15449
|
debug("runner resolved successfully");
|
|
15428
|
-
const { config, runner, state } = preparedData;
|
|
15450
|
+
const { config, runner, state, commands, rpc: rpc2 } = preparedData;
|
|
15429
15451
|
state.durations.prepare = performance.now() - state.durations.prepare;
|
|
15430
15452
|
debug("prepare time", state.durations.prepare, "ms");
|
|
15453
|
+
let contextSwitched = false;
|
|
15454
|
+
if (server.provider === "webdriverio") {
|
|
15455
|
+
let switchPromise = null;
|
|
15456
|
+
commands.onCommand(async () => {
|
|
15457
|
+
if (switchPromise) {
|
|
15458
|
+
await switchPromise;
|
|
15459
|
+
}
|
|
15460
|
+
if (!contextSwitched) {
|
|
15461
|
+
switchPromise = rpc2.wdioSwitchContext("iframe").finally(() => {
|
|
15462
|
+
switchPromise = null;
|
|
15463
|
+
contextSwitched = true;
|
|
15464
|
+
});
|
|
15465
|
+
await switchPromise;
|
|
15466
|
+
}
|
|
15467
|
+
});
|
|
15468
|
+
}
|
|
15431
15469
|
try {
|
|
15432
15470
|
await Promise.all([
|
|
15433
15471
|
setupCommonEnv(config),
|
|
@@ -15454,6 +15492,9 @@ async function executeTests(method, files) {
|
|
|
15454
15492
|
page[cleanupSymbol]();
|
|
15455
15493
|
}
|
|
15456
15494
|
await userEvent.cleanup();
|
|
15495
|
+
if (contextSwitched) {
|
|
15496
|
+
await rpc2.wdioSwitchContext("parent");
|
|
15497
|
+
}
|
|
15457
15498
|
} catch (error) {
|
|
15458
15499
|
await client.rpc.onUnhandledError({
|
|
15459
15500
|
name: error.name,
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
1
4
|
(function polyfill() {
|
|
2
5
|
const relList = document.createElement("link").relList;
|
|
3
6
|
if (relList && relList.supports && relList.supports("modulepreload")) {
|
|
@@ -185,7 +188,27 @@ function getWorkerState() {
|
|
|
185
188
|
}
|
|
186
189
|
return state;
|
|
187
190
|
}
|
|
191
|
+
class CommandsManager {
|
|
192
|
+
constructor() {
|
|
193
|
+
__publicField(this, "_listeners", []);
|
|
194
|
+
}
|
|
195
|
+
onCommand(listener) {
|
|
196
|
+
this._listeners.push(listener);
|
|
197
|
+
}
|
|
198
|
+
async triggerCommand(command, args) {
|
|
199
|
+
var _a, _b;
|
|
200
|
+
const state = /* @__PURE__ */ getWorkerState();
|
|
201
|
+
const rpc = state.rpc;
|
|
202
|
+
const { sessionId } = /* @__PURE__ */ getBrowserState();
|
|
203
|
+
const filepath = state.filepath || ((_b = (_a = state.current) == null ? void 0 : _a.file) == null ? void 0 : _b.filepath);
|
|
204
|
+
if (this._listeners.length) {
|
|
205
|
+
await Promise.all(this._listeners.map((listener) => listener(command, args)));
|
|
206
|
+
}
|
|
207
|
+
return rpc.triggerCommand(sessionId, command, filepath, args);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
188
210
|
export {
|
|
211
|
+
CommandsManager as C,
|
|
189
212
|
getConfig as a,
|
|
190
213
|
resolve as b,
|
|
191
214
|
getWorkerState as c,
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { channel, client } from '@vitest/browser/client'
|
|
2
2
|
|
|
3
3
|
function serializeError(unhandledError) {
|
|
4
|
+
const state = globalThis.__vitest_worker__
|
|
5
|
+
const VITEST_TEST_NAME = state && state.current && state.current.type === 'test'
|
|
6
|
+
? state.current.name
|
|
7
|
+
: undefined
|
|
8
|
+
const VITEST_TEST_PATH = state && state.filepath ? state.filepath : undefined
|
|
9
|
+
|
|
4
10
|
if (typeof unhandledError !== 'object' || !unhandledError) {
|
|
5
11
|
return {
|
|
6
12
|
message: String(unhandledError),
|
|
13
|
+
VITEST_TEST_NAME,
|
|
14
|
+
VITEST_TEST_PATH,
|
|
7
15
|
}
|
|
8
16
|
}
|
|
9
17
|
|
|
@@ -11,6 +19,8 @@ function serializeError(unhandledError) {
|
|
|
11
19
|
name: unhandledError.name,
|
|
12
20
|
message: unhandledError.message,
|
|
13
21
|
stack: String(unhandledError.stack),
|
|
22
|
+
VITEST_TEST_NAME,
|
|
23
|
+
VITEST_TEST_PATH,
|
|
14
24
|
}
|
|
15
25
|
}
|
|
16
26
|
|
|
@@ -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-C0dFtnHa.js"></script>
|
|
30
|
+
<link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-CBFLDkwI.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-CHxkAhrF.js"></script>
|
|
9
|
+
<link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-CBFLDkwI.js">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
</body>
|
package/dist/context.js
CHANGED
|
@@ -113,14 +113,10 @@ function getParent(el) {
|
|
|
113
113
|
|
|
114
114
|
const state = () => getWorkerState();
|
|
115
115
|
const provider = __vitest_browser_runner__.provider;
|
|
116
|
-
function filepath() {
|
|
117
|
-
return getWorkerState().filepath || getWorkerState().current?.file?.filepath || void 0;
|
|
118
|
-
}
|
|
119
|
-
const rpc = () => getWorkerState().rpc;
|
|
120
116
|
const sessionId = getBrowserState().sessionId;
|
|
121
117
|
const channel = new BroadcastChannel(`vitest:${sessionId}`);
|
|
122
118
|
function triggerCommand(command, ...args) {
|
|
123
|
-
return
|
|
119
|
+
return getBrowserState().commands.triggerCommand(command, args);
|
|
124
120
|
}
|
|
125
121
|
function createUserEvent(__tl_user_event_base__, options) {
|
|
126
122
|
if (__tl_user_event_base__) {
|
|
@@ -135,6 +131,9 @@ function createUserEvent(__tl_user_event_base__, options) {
|
|
|
135
131
|
return createUserEvent();
|
|
136
132
|
},
|
|
137
133
|
async cleanup() {
|
|
134
|
+
if (!keyboard.unreleased.length) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
138
137
|
return ensureAwaited(async () => {
|
|
139
138
|
await triggerCommand("__vitest_cleanup", keyboard);
|
|
140
139
|
keyboard.unreleased = [];
|
|
@@ -187,9 +186,7 @@ function createUserEvent(__tl_user_event_base__, options) {
|
|
|
187
186
|
});
|
|
188
187
|
},
|
|
189
188
|
tab(options2 = {}) {
|
|
190
|
-
return ensureAwaited(() =>
|
|
191
|
-
return triggerCommand("__vitest_tab", options2);
|
|
192
|
-
});
|
|
189
|
+
return ensureAwaited(() => triggerCommand("__vitest_tab", options2));
|
|
193
190
|
},
|
|
194
191
|
async keyboard(text) {
|
|
195
192
|
return ensureAwaited(async () => {
|
|
@@ -250,21 +250,10 @@ class Locator {
|
|
|
250
250
|
toJSON() {
|
|
251
251
|
return this.selector;
|
|
252
252
|
}
|
|
253
|
-
get state() {
|
|
254
|
-
return getBrowserState();
|
|
255
|
-
}
|
|
256
|
-
get worker() {
|
|
257
|
-
return getWorkerState();
|
|
258
|
-
}
|
|
259
|
-
get rpc() {
|
|
260
|
-
return this.worker.rpc;
|
|
261
|
-
}
|
|
262
253
|
triggerCommand(command, ...args) {
|
|
263
|
-
const
|
|
264
|
-
return ensureAwaited(() =>
|
|
265
|
-
this.state.sessionId,
|
|
254
|
+
const commands = getBrowserState().commands;
|
|
255
|
+
return ensureAwaited(() => commands.triggerCommand(
|
|
266
256
|
command,
|
|
267
|
-
filepath,
|
|
268
257
|
args
|
|
269
258
|
));
|
|
270
259
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -48,6 +48,7 @@ interface WebSocketBrowserHandlers {
|
|
|
48
48
|
getBrowserFileSourceMap: (id: string) => SourceMap | null | {
|
|
49
49
|
mappings: '';
|
|
50
50
|
} | undefined;
|
|
51
|
+
wdioSwitchContext: (direction: 'iframe' | 'parent') => void;
|
|
51
52
|
sendCdpEvent: (sessionId: string, event: string, payload?: Record<string, unknown>) => unknown;
|
|
52
53
|
trackCdpEvent: (sessionId: string, type: 'on' | 'once' | 'off', event: string, listenerId: string) => void;
|
|
53
54
|
}
|
|
@@ -125,6 +126,7 @@ declare class ParentBrowserProject {
|
|
|
125
126
|
children: Set<ProjectBrowser>;
|
|
126
127
|
vitest: Vitest;
|
|
127
128
|
config: ResolvedConfig;
|
|
129
|
+
private sourceMapCache;
|
|
128
130
|
constructor(project: TestProject, base: string);
|
|
129
131
|
setServer(vite: Vite.ViteDevServer): void;
|
|
130
132
|
spawn(project: TestProject): ProjectBrowser;
|
|
@@ -139,6 +141,7 @@ declare class ParentBrowserProject {
|
|
|
139
141
|
sessionId: string;
|
|
140
142
|
testFile: string;
|
|
141
143
|
};
|
|
144
|
+
private retrieveSourceMapURL;
|
|
142
145
|
}
|
|
143
146
|
|
|
144
147
|
declare const distRoot: string;
|
package/dist/index.js
CHANGED
|
@@ -11,12 +11,12 @@ import { fileURLToPath } from 'node:url';
|
|
|
11
11
|
import crypto from 'node:crypto';
|
|
12
12
|
import { mkdir, readFile as readFile$1 } from 'node:fs/promises';
|
|
13
13
|
import { parseErrorStacktrace, parseStacktrace } from '@vitest/utils/source-map';
|
|
14
|
-
import { P as PlaywrightBrowserProvider, W as WebdriverBrowserProvider } from './webdriver-
|
|
14
|
+
import { P as PlaywrightBrowserProvider, W as WebdriverBrowserProvider } from './webdriver-C5-VI7VH.js';
|
|
15
15
|
import { resolve as resolve$1, dirname as dirname$1, basename as basename$1, normalize as normalize$1 } from 'node:path';
|
|
16
16
|
import { WebSocketServer } from 'ws';
|
|
17
17
|
import * as nodeos from 'node:os';
|
|
18
18
|
|
|
19
|
-
var version = "3.0.
|
|
19
|
+
var version = "3.0.8";
|
|
20
20
|
|
|
21
21
|
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
|
22
22
|
function normalizeWindowsPath(input = "") {
|
|
@@ -548,11 +548,10 @@ function BrowserContext(globalServer) {
|
|
|
548
548
|
}
|
|
549
549
|
async function generateContextFile(globalServer) {
|
|
550
550
|
const commands = Object.keys(globalServer.commands);
|
|
551
|
-
const filepathCode = "__vitest_worker__.filepath || __vitest_worker__.current?.file?.filepath || undefined";
|
|
552
551
|
const provider = [...globalServer.children][0].provider || { name: "preview" };
|
|
553
552
|
const providerName = provider.name;
|
|
554
553
|
const commandsCode = commands.filter((command) => !command.startsWith("__vitest")).map((command) => {
|
|
555
|
-
return ` ["${command}"]: (...args) =>
|
|
554
|
+
return ` ["${command}"]: (...args) => __vitest_browser_runner__.commands.triggerCommand("${command}", args),`;
|
|
556
555
|
}).join("\n");
|
|
557
556
|
const userEventNonProviderImport = await getUserEventImport(
|
|
558
557
|
providerName,
|
|
@@ -562,9 +561,6 @@ async function generateContextFile(globalServer) {
|
|
|
562
561
|
return `
|
|
563
562
|
import { page, createUserEvent, cdp } from '${distContextPath}'
|
|
564
563
|
${userEventNonProviderImport}
|
|
565
|
-
const filepath = () => ${filepathCode}
|
|
566
|
-
const rpc = () => __vitest_worker__.rpc
|
|
567
|
-
const sessionId = __vitest_browser_runner__.sessionId
|
|
568
564
|
|
|
569
565
|
export const server = {
|
|
570
566
|
platform: ${JSON.stringify(process.platform)},
|
|
@@ -780,8 +776,7 @@ var BrowserPlugin = (parentServer, base = "/") => {
|
|
|
780
776
|
"vitest > chai",
|
|
781
777
|
"vitest > chai > loupe",
|
|
782
778
|
"vitest > @vitest/utils > loupe",
|
|
783
|
-
"@vitest/browser > @testing-library/user-event"
|
|
784
|
-
"@vitest/browser > @testing-library/dom"
|
|
779
|
+
"@vitest/browser > @testing-library/user-event"
|
|
785
780
|
];
|
|
786
781
|
const fileRoot = browserTestFiles[0] ? dirname(browserTestFiles[0]) : project.config.root;
|
|
787
782
|
const svelte = isPackageExists("vitest-browser-svelte", fileRoot);
|
|
@@ -2065,6 +2060,9 @@ const keyboard = async (context, text, state) => {
|
|
|
2065
2060
|
};
|
|
2066
2061
|
const keyboardCleanup = async (context, state) => {
|
|
2067
2062
|
const { provider, sessionId } = context;
|
|
2063
|
+
if (!state.unreleased) {
|
|
2064
|
+
return;
|
|
2065
|
+
}
|
|
2068
2066
|
if (provider instanceof PlaywrightBrowserProvider) {
|
|
2069
2067
|
const page = provider.getPage(sessionId);
|
|
2070
2068
|
for (const key of state.unreleased) {
|
|
@@ -2477,17 +2475,36 @@ class ParentBrowserProject {
|
|
|
2477
2475
|
this.stackTraceOptions = {
|
|
2478
2476
|
frameFilter: project.config.onStackTrace,
|
|
2479
2477
|
getSourceMap: (id) => {
|
|
2478
|
+
if (this.sourceMapCache.has(id)) {
|
|
2479
|
+
return this.sourceMapCache.get(id);
|
|
2480
|
+
}
|
|
2480
2481
|
const result = this.vite.moduleGraph.getModuleById(id)?.transformResult;
|
|
2482
|
+
if (result && !result.map) {
|
|
2483
|
+
const sourceMapUrl = this.retrieveSourceMapURL(result.code);
|
|
2484
|
+
if (!sourceMapUrl) {
|
|
2485
|
+
return null;
|
|
2486
|
+
}
|
|
2487
|
+
const filepathDir = dirname(id);
|
|
2488
|
+
const sourceMapPath = resolve(filepathDir, sourceMapUrl);
|
|
2489
|
+
const map = JSON.parse(readFileSync(sourceMapPath, "utf-8"));
|
|
2490
|
+
this.sourceMapCache.set(id, map);
|
|
2491
|
+
return map;
|
|
2492
|
+
}
|
|
2481
2493
|
return result?.map;
|
|
2482
2494
|
},
|
|
2483
|
-
|
|
2495
|
+
getUrlId: (id) => {
|
|
2484
2496
|
const mod = this.vite.moduleGraph.getModuleById(id);
|
|
2485
|
-
if (mod
|
|
2486
|
-
return
|
|
2497
|
+
if (mod) {
|
|
2498
|
+
return id;
|
|
2487
2499
|
}
|
|
2488
|
-
const
|
|
2489
|
-
|
|
2490
|
-
|
|
2500
|
+
const resolvedPath = resolve(project.config.root, id.slice(1));
|
|
2501
|
+
const modUrl = this.vite.moduleGraph.getModuleById(resolvedPath);
|
|
2502
|
+
if (modUrl) {
|
|
2503
|
+
return resolvedPath;
|
|
2504
|
+
}
|
|
2505
|
+
const files = this.vite.moduleGraph.getModulesByFile(resolvedPath);
|
|
2506
|
+
if (files && files.size) {
|
|
2507
|
+
return files.values().next().value.id;
|
|
2491
2508
|
}
|
|
2492
2509
|
return id;
|
|
2493
2510
|
}
|
|
@@ -2542,6 +2559,8 @@ class ParentBrowserProject {
|
|
|
2542
2559
|
children = /* @__PURE__ */ new Set();
|
|
2543
2560
|
vitest;
|
|
2544
2561
|
config;
|
|
2562
|
+
// cache for non-vite source maps
|
|
2563
|
+
sourceMapCache = /* @__PURE__ */ new Map();
|
|
2545
2564
|
setServer(vite) {
|
|
2546
2565
|
this.vite = vite;
|
|
2547
2566
|
}
|
|
@@ -2642,6 +2661,17 @@ class ParentBrowserProject {
|
|
|
2642
2661
|
const decodedTestFile = decodeURIComponent(testFile);
|
|
2643
2662
|
return { sessionId, testFile: decodedTestFile };
|
|
2644
2663
|
}
|
|
2664
|
+
retrieveSourceMapURL(source) {
|
|
2665
|
+
const re = /\/\/[@#]\s*sourceMappingURL=([^\s'"]+)\s*$|\/\*[@#]\s*sourceMappingURL=[^\s*'"]+\s*\*\/\s*$/gm;
|
|
2666
|
+
let lastMatch, match;
|
|
2667
|
+
while (match = re.exec(source)) {
|
|
2668
|
+
lastMatch = match;
|
|
2669
|
+
}
|
|
2670
|
+
if (!lastMatch) {
|
|
2671
|
+
return null;
|
|
2672
|
+
}
|
|
2673
|
+
return lastMatch[1];
|
|
2674
|
+
}
|
|
2645
2675
|
}
|
|
2646
2676
|
|
|
2647
2677
|
const DEFAULT_TIMEOUT = 6e4;
|
|
@@ -2932,6 +2962,20 @@ function setupBrowserRpc(globalServer) {
|
|
|
2932
2962
|
getCountOfFailedTests() {
|
|
2933
2963
|
return vitest.state.getCountOfFailedTests();
|
|
2934
2964
|
},
|
|
2965
|
+
async wdioSwitchContext(direction) {
|
|
2966
|
+
const provider = project.browser.provider;
|
|
2967
|
+
if (!provider) {
|
|
2968
|
+
throw new Error("Commands are only available for browser tests.");
|
|
2969
|
+
}
|
|
2970
|
+
if (provider.name !== "webdriverio") {
|
|
2971
|
+
throw new Error("Switch context is only available for WebDriverIO provider.");
|
|
2972
|
+
}
|
|
2973
|
+
if (direction === "iframe") {
|
|
2974
|
+
await provider.switchToTestFrame();
|
|
2975
|
+
} else {
|
|
2976
|
+
await provider.switchToMainFrame();
|
|
2977
|
+
}
|
|
2978
|
+
},
|
|
2935
2979
|
async triggerCommand(sessionId, command, testPath, payload) {
|
|
2936
2980
|
debug$1?.('[%s] Triggering command "%s"', sessionId, command);
|
|
2937
2981
|
const provider = project.browser.provider;
|
|
@@ -2942,7 +2986,6 @@ function setupBrowserRpc(globalServer) {
|
|
|
2942
2986
|
if (!commands || !commands[command]) {
|
|
2943
2987
|
throw new Error(`Unknown command "${command}".`);
|
|
2944
2988
|
}
|
|
2945
|
-
await provider.beforeCommand?.(command, payload);
|
|
2946
2989
|
const context = Object.assign(
|
|
2947
2990
|
{
|
|
2948
2991
|
testPath,
|
|
@@ -2953,13 +2996,7 @@ function setupBrowserRpc(globalServer) {
|
|
|
2953
2996
|
},
|
|
2954
2997
|
provider.getCommandsContext(sessionId)
|
|
2955
2998
|
);
|
|
2956
|
-
|
|
2957
|
-
try {
|
|
2958
|
-
result = await commands[command](context, ...payload);
|
|
2959
|
-
} finally {
|
|
2960
|
-
await provider.afterCommand?.(command, payload);
|
|
2961
|
-
}
|
|
2962
|
-
return result;
|
|
2999
|
+
return await commands[command](context, ...payload);
|
|
2963
3000
|
},
|
|
2964
3001
|
finishBrowserTests(sessionId) {
|
|
2965
3002
|
debug$1?.("[%s] Finishing browser tests for session", sessionId);
|
package/dist/locators/index.d.ts
CHANGED
|
@@ -258,9 +258,6 @@ declare abstract class Locator {
|
|
|
258
258
|
last(): Locator;
|
|
259
259
|
toString(): string;
|
|
260
260
|
toJSON(): string;
|
|
261
|
-
private get state();
|
|
262
|
-
private get worker();
|
|
263
|
-
private get rpc();
|
|
264
261
|
protected triggerCommand<T>(command: string, ...args: any[]): Promise<T>;
|
|
265
262
|
}
|
|
266
263
|
|
package/dist/locators/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { page, server } from '@vitest/browser/context';
|
|
2
2
|
import { g as getByTitleSelector, a as getByTextSelector, b as getByPlaceholderSelector, c as getByAltTextSelector, d as getByTestIdSelector, e as getByRoleSelector, f as getByLabelSelector } from '../public-utils-J4vwTaki.js';
|
|
3
|
-
import { s as selectorEngine, L as Locator } from '../index-
|
|
3
|
+
import { s as selectorEngine, L as Locator } from '../index-fqTesRIH.js';
|
|
4
4
|
import 'vitest/utils';
|
|
5
5
|
|
|
6
6
|
page.extend({
|
package/dist/locators/preview.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { page, server, userEvent } from '@vitest/browser/context';
|
|
2
2
|
import { g as getByTitleSelector, a as getByTextSelector, b as getByPlaceholderSelector, c as getByAltTextSelector, d as getByTestIdSelector, e as getByRoleSelector, f as getByLabelSelector, h as getElementError } from '../public-utils-J4vwTaki.js';
|
|
3
|
-
import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-
|
|
3
|
+
import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-fqTesRIH.js';
|
|
4
4
|
import 'vitest/utils';
|
|
5
5
|
|
|
6
6
|
page.extend({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { page, server } from '@vitest/browser/context';
|
|
2
2
|
import { g as getByTitleSelector, a as getByTextSelector, b as getByPlaceholderSelector, c as getByAltTextSelector, d as getByTestIdSelector, e as getByRoleSelector, f as getByLabelSelector, h as getElementError } from '../public-utils-J4vwTaki.js';
|
|
3
|
-
import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-
|
|
3
|
+
import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-fqTesRIH.js';
|
|
4
4
|
import 'vitest/utils';
|
|
5
5
|
|
|
6
6
|
page.extend({
|
package/dist/providers.js
CHANGED
|
@@ -186,16 +186,25 @@ class WebdriverBrowserProvider {
|
|
|
186
186
|
this.browserName = browser;
|
|
187
187
|
this.options = options;
|
|
188
188
|
}
|
|
189
|
-
async
|
|
189
|
+
async switchToTestFrame() {
|
|
190
190
|
const page = this.browser;
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
191
|
+
if (page.switchFrame) {
|
|
192
|
+
await page.switchFrame(page.$("iframe[data-vitest]"));
|
|
193
|
+
} else {
|
|
194
|
+
const iframe = await page.findElement(
|
|
195
|
+
"css selector",
|
|
196
|
+
"iframe[data-vitest]"
|
|
197
|
+
);
|
|
198
|
+
await page.switchToFrame(iframe);
|
|
199
|
+
}
|
|
196
200
|
}
|
|
197
|
-
async
|
|
198
|
-
|
|
201
|
+
async switchToMainFrame() {
|
|
202
|
+
const page = this.browser;
|
|
203
|
+
if (page.switchFrame) {
|
|
204
|
+
await page.switchFrame(null);
|
|
205
|
+
} else {
|
|
206
|
+
await page.switchToParentFrame();
|
|
207
|
+
}
|
|
199
208
|
}
|
|
200
209
|
getCommandsContext() {
|
|
201
210
|
return {
|
package/dummy.js
ADDED
|
File without changes
|