@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.
@@ -23,7 +23,7 @@
23
23
  })();
24
24
  </script>
25
25
  <!-- !LOAD_METADATA! -->
26
- <script type="module" src="./assets/index-BX_iUIjH.js"></script>
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>
@@ -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-Owv5OOOf.js";
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-Owv5OOOf.js";
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
- url2 = urlObj.pathname;
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
- let stacks = !CHROME_IE_STACK_REGEXP.test(stack) ? parseFFOrSafariStackTrace(stack) : parseV8Stacktrace(stack);
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.getFileName) {
15117
- stack2.file = options.getFileName(stack2.file);
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 { ...stack2, line, column };
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-BR1Ueh0Q.js"></script>
30
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-Owv5OOOf.js">
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-oUsZBBvV.js"></script>
9
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-Owv5OOOf.js">
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 rpc().triggerCommand(sessionId, command, filepath(), args);
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 filepath = this.worker.filepath || this.worker.current?.file?.filepath || void 0;
264
- return ensureAwaited(() => this.rpc.triggerCommand(
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-kh_HHy0p.js';
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.6";
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) => rpc().triggerCommand(sessionId, "${command}", filepath(), 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
- getFileName: (id) => {
2495
+ getUrlId: (id) => {
2484
2496
  const mod = this.vite.moduleGraph.getModuleById(id);
2485
- if (mod?.file) {
2486
- return mod.file;
2497
+ if (mod) {
2498
+ return id;
2487
2499
  }
2488
- const modUrl = this.vite.moduleGraph.urlToModuleMap.get(id);
2489
- if (modUrl?.file) {
2490
- return modUrl.file;
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
- let result;
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);
@@ -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
 
@@ -1,4 +1,4 @@
1
1
  import '@vitest/browser/context';
2
2
  import '../public-utils-J4vwTaki.js';
3
- export { L as Locator, s as selectorEngine } from '../index-D-kNWeee.js';
3
+ export { L as Locator, s as selectorEngine } from '../index-fqTesRIH.js';
4
4
  import 'vitest/utils';
@@ -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-D-kNWeee.js';
3
+ import { s as selectorEngine, L as Locator } from '../index-fqTesRIH.js';
4
4
  import 'vitest/utils';
5
5
 
6
6
  page.extend({
@@ -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-D-kNWeee.js';
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-D-kNWeee.js';
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
@@ -1,4 +1,4 @@
1
- import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-kh_HHy0p.js';
1
+ import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-C5-VI7VH.js';
2
2
 
3
3
  class PreviewBrowserProvider {
4
4
  name = "preview";
@@ -186,16 +186,25 @@ class WebdriverBrowserProvider {
186
186
  this.browserName = browser;
187
187
  this.options = options;
188
188
  }
189
- async beforeCommand() {
189
+ async switchToTestFrame() {
190
190
  const page = this.browser;
191
- const iframe = await page.findElement(
192
- "css selector",
193
- "iframe[data-vitest]"
194
- );
195
- await page.switchToFrame(iframe);
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 afterCommand() {
198
- await this.browser.switchToParentFrame();
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