@vitest/browser 3.0.0-beta.2 → 3.0.0-beta.4

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.
@@ -253,6 +253,9 @@ declare abstract class Locator {
253
253
  element(): Element;
254
254
  elements(): Element[];
255
255
  all(): Locator[];
256
+ nth(index: number): Locator;
257
+ first(): Locator;
258
+ last(): Locator;
256
259
  toString(): string;
257
260
  toJSON(): string;
258
261
  private get state();
@@ -1,4 +1,4 @@
1
1
  import '@vitest/browser/context';
2
2
  import '../public-utils-D6S2-5kI.js';
3
- export { L as Locator, s as selectorEngine } from '../index-CMAn5ZST.js';
3
+ export { L as Locator, s as selectorEngine } from '../index-Dos_sf7B.js';
4
4
  import 'vitest/utils';
@@ -1,6 +1,6 @@
1
1
  import { page, server } from '@vitest/browser/context';
2
2
  import { g as getByLabelSelector, a as getByRoleSelector, b as getByTestIdSelector, c as getByAltTextSelector, d as getByPlaceholderSelector, e as getByTextSelector, f as getByTitleSelector } from '../public-utils-D6S2-5kI.js';
3
- import { s as selectorEngine, L as Locator } from '../index-CMAn5ZST.js';
3
+ import { s as selectorEngine, L as Locator } from '../index-Dos_sf7B.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 getByLabelSelector, a as getByRoleSelector, b as getByTestIdSelector, c as getByAltTextSelector, d as getByPlaceholderSelector, e as getByTextSelector, f as getByTitleSelector, h as getElementError } from '../public-utils-D6S2-5kI.js';
3
- import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-CMAn5ZST.js';
3
+ import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-Dos_sf7B.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 getByLabelSelector, a as getByRoleSelector, b as getByTestIdSelector, c as getByAltTextSelector, d as getByPlaceholderSelector, e as getByTextSelector, f as getByTitleSelector, h as getElementError } from '../public-utils-D6S2-5kI.js';
3
- import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-CMAn5ZST.js';
3
+ import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-Dos_sf7B.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-JzwxG3Ek.js';
1
+ import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-dkCg9pjp.js';
2
2
 
3
3
  class PreviewBrowserProvider {
4
4
  name = "preview";
@@ -22,9 +22,9 @@ class PreviewBrowserProvider {
22
22
  `You've enabled headless mode for "preview" provider but it doesn't support it. Use "playwright" or "webdriverio" instead: https://vitest.dev/guide/browser/#configuration`
23
23
  );
24
24
  }
25
- project.ctx.logger.printBrowserBanner(project);
25
+ project.vitest.logger.printBrowserBanner(project);
26
26
  }
27
- async openPage(_contextId, url) {
27
+ async openPage(_sessionId, url) {
28
28
  this.open = true;
29
29
  if (!this.project.browser) {
30
30
  throw new Error("Browser is not initialized");
package/dist/state.js CHANGED
@@ -1 +1 @@
1
- (function(){"use strict";const{parse:$parse,stringify:$stringify}=JSON;const{keys}=Object;const Primitive=String;const primitive="string";const ignore={};const object="object";const noop=(_,value)=>value;const primitives=value=>value instanceof Primitive?Primitive(value):value;const Primitives=(_,value)=>typeof value===primitive?new Primitive(value):value;const revive=(input,parsed,output,$)=>{const lazy=[];for(let ke=keys(output),{length}=ke,y=0;y<length;y++){const k=ke[y];const value=output[k];if(value instanceof Primitive){const tmp=input[value];if(typeof tmp===object&&!parsed.has(tmp)){parsed.add(tmp);output[k]=ignore;lazy.push({k,a:[input,parsed,tmp,$]})}else output[k]=$.call(output,k,tmp)}else if(output[k]!==ignore)output[k]=$.call(output,k,value)}for(let{length}=lazy,i=0;i<length;i++){const{k,a}=lazy[i];output[k]=$.call(output,k,revive.apply(null,a))}return output};const parse=(text,reviver)=>{const input=$parse(text,Primitives).map(primitives);const value=input[0];const $=noop;const tmp=typeof value===object&&value?revive(input,new Set,value,$):value;return $.call({"":tmp},"",tmp)};function getBrowserState(){return window.__vitest_browser_runner__}const config=getBrowserState().config;const contextId=getBrowserState().contextId;const providedContext=parse(getBrowserState().providedContext);const state={ctx:{pool:"browser",worker:"./browser.js",workerId:1,config,projectName:config.name||"",files:[],environment:{name:"browser",options:null},providedContext,invalidates:[]},onCancel:null,config,environment:{name:"browser",transformMode:"web",setup(){throw new Error("Not called in the browser")}},moduleCache:getBrowserState().moduleCache,rpc:null,durations:{environment:0,prepare:performance.now()},providedContext};globalThis.__vitest_browser__=true;globalThis.__vitest_worker__=state;getBrowserState().cdp=createCdp();function rpc(){return state.rpc}function createCdp(){const listenersMap=new WeakMap;function getId(listener){const id=listenersMap.get(listener)||crypto.randomUUID();listenersMap.set(listener,id);return id}const listeners={};const cdp={send(method,params){return rpc().sendCdpEvent(contextId,method,params)},on(event,listener){const listenerId=getId(listener);listeners[event]=listeners[event]||[];listeners[event].push(listener);rpc().trackCdpEvent(contextId,"on",event,listenerId).catch(error);return cdp},once(event,listener){const listenerId=getId(listener);const handler=data=>{listener(data);cdp.off(event,listener)};listeners[event]=listeners[event]||[];listeners[event].push(handler);rpc().trackCdpEvent(contextId,"once",event,listenerId).catch(error);return cdp},off(event,listener){const listenerId=getId(listener);if(listeners[event]){listeners[event]=listeners[event].filter(l=>l!==listener)}rpc().trackCdpEvent(contextId,"off",event,listenerId).catch(error);return cdp},emit(event,payload){if(listeners[event]){listeners[event].forEach(l=>{try{l(payload)}catch(err){error(err)}})}}};return cdp}function error(err){window.dispatchEvent(new ErrorEvent("error",{error:err}))}})();
1
+ (function(){"use strict";const{parse:$parse,stringify:$stringify}=JSON;const{keys}=Object;const Primitive=String;const primitive="string";const ignore={};const object="object";const noop=(_,value)=>value;const primitives=value=>value instanceof Primitive?Primitive(value):value;const Primitives=(_,value)=>typeof value===primitive?new Primitive(value):value;const revive=(input,parsed,output,$)=>{const lazy=[];for(let ke=keys(output),{length}=ke,y=0;y<length;y++){const k=ke[y];const value=output[k];if(value instanceof Primitive){const tmp=input[value];if(typeof tmp===object&&!parsed.has(tmp)){parsed.add(tmp);output[k]=ignore;lazy.push({k,a:[input,parsed,tmp,$]})}else output[k]=$.call(output,k,tmp)}else if(output[k]!==ignore)output[k]=$.call(output,k,value)}for(let{length}=lazy,i=0;i<length;i++){const{k,a}=lazy[i];output[k]=$.call(output,k,revive.apply(null,a))}return output};const parse=(text,reviver)=>{const input=$parse(text,Primitives).map(primitives);const value=input[0];const $=noop;const tmp=typeof value===object&&value?revive(input,new Set,value,$):value;return $.call({"":tmp},"",tmp)};function getBrowserState(){return window.__vitest_browser_runner__}const config=getBrowserState().config;const sessionId=getBrowserState().sessionId;const providedContext=parse(getBrowserState().providedContext);const state={ctx:{pool:"browser",worker:"./browser.js",workerId:1,config,projectName:config.name||"",files:[],environment:{name:"browser",options:null},providedContext,invalidates:[]},onCancel:null,config,environment:{name:"browser",transformMode:"web",setup(){throw new Error("Not called in the browser")}},moduleCache:getBrowserState().moduleCache,rpc:null,durations:{environment:0,prepare:performance.now()},providedContext};globalThis.__vitest_browser__=true;globalThis.__vitest_worker__=state;getBrowserState().cdp=createCdp();function rpc(){return state.rpc}function createCdp(){const listenersMap=new WeakMap;function getId(listener){const id=listenersMap.get(listener)||crypto.randomUUID();listenersMap.set(listener,id);return id}const listeners={};const cdp={send(method,params){return rpc().sendCdpEvent(sessionId,method,params)},on(event,listener){const listenerId=getId(listener);listeners[event]=listeners[event]||[];listeners[event].push(listener);rpc().trackCdpEvent(sessionId,"on",event,listenerId).catch(error);return cdp},once(event,listener){const listenerId=getId(listener);const handler=data=>{listener(data);cdp.off(event,listener)};listeners[event]=listeners[event]||[];listeners[event].push(handler);rpc().trackCdpEvent(sessionId,"once",event,listenerId).catch(error);return cdp},off(event,listener){const listenerId=getId(listener);if(listeners[event]){listeners[event]=listeners[event].filter(l=>l!==listener)}rpc().trackCdpEvent(sessionId,"off",event,listenerId).catch(error);return cdp},emit(event,payload){if(listeners[event]){listeners[event].forEach(l=>{try{l(payload)}catch(err){error(err)}})}}};return cdp}function error(err){window.dispatchEvent(new ErrorEvent("error",{error:err}))}})();
@@ -37,7 +37,7 @@ class PlaywrightBrowserProvider {
37
37
  launchOptions.args ||= [];
38
38
  launchOptions.args.push(`--remote-debugging-port=${port}`);
39
39
  launchOptions.args.push(`--remote-debugging-address=${host}`);
40
- this.project.logger.log(`Debugger listening on ws://${host}:${port}`);
40
+ this.project.vitest.logger.log(`Debugger listening on ws://${host}:${port}`);
41
41
  }
42
42
  if (this.project.config.browser.ui && this.browserName === "chromium") {
43
43
  if (!launchOptions.args) {
@@ -54,9 +54,9 @@ class PlaywrightBrowserProvider {
54
54
  })();
55
55
  return this.browserPromise;
56
56
  }
57
- async createContext(contextId) {
58
- if (this.contexts.has(contextId)) {
59
- return this.contexts.get(contextId);
57
+ async createContext(sessionId) {
58
+ if (this.contexts.has(sessionId)) {
59
+ return this.contexts.get(sessionId);
60
60
  }
61
61
  const browser = await this.openBrowser();
62
62
  const { actionTimeout, ...contextOptions } = this.options?.context ?? {};
@@ -72,21 +72,21 @@ class PlaywrightBrowserProvider {
72
72
  if (actionTimeout) {
73
73
  context.setDefaultTimeout(actionTimeout);
74
74
  }
75
- this.contexts.set(contextId, context);
75
+ this.contexts.set(sessionId, context);
76
76
  return context;
77
77
  }
78
- getPage(contextId) {
79
- const page = this.pages.get(contextId);
78
+ getPage(sessionId) {
79
+ const page = this.pages.get(sessionId);
80
80
  if (!page) {
81
- throw new Error(`Page "${contextId}" not found`);
81
+ throw new Error(`Page "${sessionId}" not found in ${this.browserName} browser.`);
82
82
  }
83
83
  return page;
84
84
  }
85
- getCommandsContext(contextId) {
86
- const page = this.getPage(contextId);
85
+ getCommandsContext(sessionId) {
86
+ const page = this.getPage(sessionId);
87
87
  return {
88
88
  page,
89
- context: this.contexts.get(contextId),
89
+ context: this.contexts.get(sessionId),
90
90
  frame() {
91
91
  return new Promise((resolve, reject) => {
92
92
  const frame = page.frame("vitest-iframe");
@@ -108,15 +108,15 @@ class PlaywrightBrowserProvider {
108
108
  }
109
109
  };
110
110
  }
111
- async openBrowserPage(contextId) {
112
- if (this.pages.has(contextId)) {
113
- const page2 = this.pages.get(contextId);
111
+ async openBrowserPage(sessionId) {
112
+ if (this.pages.has(sessionId)) {
113
+ const page2 = this.pages.get(sessionId);
114
114
  await page2.close();
115
- this.pages.delete(contextId);
115
+ this.pages.delete(sessionId);
116
116
  }
117
- const context = await this.createContext(contextId);
117
+ const context = await this.createContext(sessionId);
118
118
  const page = await context.newPage();
119
- this.pages.set(contextId, page);
119
+ this.pages.set(sessionId, page);
120
120
  if (process.env.VITEST_PW_DEBUG) {
121
121
  page.on("requestfailed", (request) => {
122
122
  console.error(
@@ -131,13 +131,13 @@ class PlaywrightBrowserProvider {
131
131
  }
132
132
  return page;
133
133
  }
134
- async openPage(contextId, url, beforeNavigate) {
135
- const browserPage = await this.openBrowserPage(contextId);
134
+ async openPage(sessionId, url, beforeNavigate) {
135
+ const browserPage = await this.openBrowserPage(sessionId);
136
136
  await beforeNavigate?.();
137
137
  await browserPage.goto(url, { timeout: 0 });
138
138
  }
139
- async getCDPSession(contextId) {
140
- const page = this.getPage(contextId);
139
+ async getCDPSession(sessionid) {
140
+ const page = this.getPage(sessionid);
141
141
  const cdp = await page.context().newCDPSession(page);
142
142
  return {
143
143
  async send(method, params) {
@@ -247,7 +247,7 @@ class WebdriverBrowserProvider {
247
247
  }
248
248
  return capabilities;
249
249
  }
250
- async openPage(_contextId, url) {
250
+ async openPage(_sessionId, url) {
251
251
  const browserInstance = await this.openBrowser();
252
252
  await browserInstance.url(url);
253
253
  }
package/jest-dom.d.ts CHANGED
@@ -192,10 +192,10 @@ declare namespace matchers {
192
192
  *
193
193
  * const ancestor = getByTestId('ancestor')
194
194
  * const descendant = getByTestId('descendant')
195
- * const nonExistantElement = getByTestId('does-not-exist')
195
+ * const nonExistentElement = getByTestId('does-not-exist')
196
196
  * expect(ancestor).toContainElement(descendant)
197
197
  * expect(descendant).not.toContainElement(ancestor)
198
- * expect(ancestor).not.toContainElement(nonExistantElement)
198
+ * expect(ancestor).not.toContainElement(nonExistentElement)
199
199
  * @see
200
200
  * [testing-library/jest-dom#tocontainelement](https://github.com/testing-library/jest-dom#tocontainelement)
201
201
  */
@@ -282,7 +282,7 @@ declare namespace matchers {
282
282
  * <option value="avocado">Avocado</option>
283
283
  * </select>
284
284
  *
285
- * <label for="mutiple-select-example">Fruits</label>
285
+ * <label for="multiple-select-example">Fruits</label>
286
286
  * <select id="multiple-select-example" multiple>
287
287
  * <option value="">Select a fruit...</option>
288
288
  * <option value="banana" selected>Banana</option>
@@ -382,7 +382,7 @@ declare namespace matchers {
382
382
  * expect(element).toHaveTextContent('Content')
383
383
  * // to match the whole content
384
384
  * expect(element).toHaveTextContent(/^Text Content$/)
385
- * // to use case-insentive match
385
+ * // to use case-insensitive match
386
386
  * expect(element).toHaveTextContent(/content$/i)
387
387
  * expect(element).not.toHaveTextContent('content')
388
388
  * @see
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "3.0.0-beta.2",
4
+ "version": "3.0.0-beta.4",
5
5
  "description": "Browser running for Vitest",
6
6
  "license": "MIT",
7
7
  "funding": "https://opencollective.com/vitest",
@@ -65,7 +65,7 @@
65
65
  "peerDependencies": {
66
66
  "playwright": "*",
67
67
  "webdriverio": "*",
68
- "vitest": "3.0.0-beta.2"
68
+ "vitest": "3.0.0-beta.4"
69
69
  },
70
70
  "peerDependenciesMeta": {
71
71
  "playwright": {
@@ -81,13 +81,13 @@
81
81
  "dependencies": {
82
82
  "@testing-library/dom": "^10.4.0",
83
83
  "@testing-library/user-event": "^14.5.2",
84
- "magic-string": "^0.30.14",
85
- "msw": "^2.6.8",
84
+ "magic-string": "^0.30.17",
85
+ "msw": "^2.7.0",
86
86
  "sirv": "^3.0.0",
87
87
  "tinyrainbow": "^1.2.0",
88
88
  "ws": "^8.18.0",
89
- "@vitest/mocker": "3.0.0-beta.2",
90
- "@vitest/utils": "3.0.0-beta.2"
89
+ "@vitest/mocker": "3.0.0-beta.4",
90
+ "@vitest/utils": "3.0.0-beta.4"
91
91
  },
92
92
  "devDependencies": {
93
93
  "@testing-library/jest-dom": "^6.6.3",
@@ -96,17 +96,17 @@
96
96
  "birpc": "0.2.19",
97
97
  "flatted": "^3.3.2",
98
98
  "ivya": "^1.1.1",
99
- "mime": "^4.0.4",
100
- "pathe": "^1.1.2",
99
+ "mime": "^4.0.6",
100
+ "pathe": "^2.0.0",
101
101
  "periscopic": "^4.0.2",
102
- "playwright": "^1.49.0",
103
- "playwright-core": "^1.49.0",
102
+ "playwright": "^1.49.1",
103
+ "playwright-core": "^1.49.1",
104
104
  "safaridriver": "^1.0.0",
105
- "webdriverio": "^8.40.6",
106
- "@vitest/ui": "3.0.0-beta.2",
107
- "@vitest/ws-client": "3.0.0-beta.2",
108
- "@vitest/runner": "3.0.0-beta.2",
109
- "vitest": "3.0.0-beta.2"
105
+ "webdriverio": "^8.41.0",
106
+ "@vitest/runner": "3.0.0-beta.4",
107
+ "@vitest/ui": "3.0.0-beta.4",
108
+ "@vitest/ws-client": "3.0.0-beta.4",
109
+ "vitest": "3.0.0-beta.4"
110
110
  },
111
111
  "scripts": {
112
112
  "build": "rimraf dist && pnpm build:node && pnpm build:client",
@@ -9,9 +9,10 @@ import type {
9
9
  } from 'playwright'
10
10
  import { Protocol } from 'playwright-core/types/protocol'
11
11
  import '../matchers.js'
12
+ import type {} from "vitest/node"
12
13
 
13
14
  declare module 'vitest/node' {
14
- interface BrowserProviderOptions {
15
+ export interface BrowserProviderOptions {
15
16
  launch?: LaunchOptions
16
17
  context?: Omit<
17
18
  BrowserContextOptions,
@@ -1,8 +1,9 @@
1
1
  import type { RemoteOptions, ClickOptions, DragAndDropOptions } from 'webdriverio'
2
2
  import '../matchers.js'
3
+ import type {} from "vitest/node"
3
4
 
4
5
  declare module 'vitest/node' {
5
- interface BrowserProviderOptions extends RemoteOptions {}
6
+ export interface BrowserProviderOptions extends Partial<RemoteOptions> {}
6
7
 
7
8
  export interface UserEventClickOptions extends ClickOptions {}
8
9