@vitest/browser 3.0.0-beta.1 → 3.0.0-beta.3

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,8 @@ declare abstract class Locator {
253
253
  element(): Element;
254
254
  elements(): Element[];
255
255
  all(): Locator[];
256
+ toString(): string;
257
+ toJSON(): string;
256
258
  private get state();
257
259
  private get worker();
258
260
  private get rpc();
@@ -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-CKtADM3n.js';
3
+ export { L as Locator, s as selectorEngine } from '../index-VFFcOojA.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-CKtADM3n.js';
3
+ import { s as selectorEngine, L as Locator } from '../index-VFFcOojA.js';
4
4
  import 'vitest/utils';
5
5
 
6
6
  page.extend({
@@ -1,7 +1,6 @@
1
- import { userEvent } from '@testing-library/user-event';
2
- import { page, server } from '@vitest/browser/context';
1
+ import { page, server, userEvent } from '@vitest/browser/context';
3
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';
4
- import { s as selectorEngine, L as Locator, c as convertElementToCssSelector, e as ensureAwaited } from '../index-CKtADM3n.js';
3
+ import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-VFFcOojA.js';
5
4
  import 'vitest/utils';
6
5
 
7
6
  page.extend({
@@ -47,53 +46,31 @@ class PreviewLocator extends Locator {
47
46
  return selectors.join(", ");
48
47
  }
49
48
  click() {
50
- return ensureAwaited(() => userEvent.click(this.element()));
49
+ return userEvent.click(this.element());
51
50
  }
52
51
  dblClick() {
53
- return ensureAwaited(() => userEvent.dblClick(this.element()));
52
+ return userEvent.dblClick(this.element());
54
53
  }
55
54
  tripleClick() {
56
- return ensureAwaited(() => userEvent.tripleClick(this.element()));
55
+ return userEvent.tripleClick(this.element());
57
56
  }
58
57
  hover() {
59
- return ensureAwaited(() => userEvent.hover(this.element()));
58
+ return userEvent.hover(this.element());
60
59
  }
61
60
  unhover() {
62
- return ensureAwaited(() => userEvent.unhover(this.element()));
61
+ return userEvent.unhover(this.element());
63
62
  }
64
63
  async fill(text) {
65
- await this.clear();
66
- return ensureAwaited(() => userEvent.type(this.element(), text));
64
+ return userEvent.fill(this.element(), text);
67
65
  }
68
66
  async upload(file) {
69
- const uploadPromise = (Array.isArray(file) ? file : [file]).map(async (file2) => {
70
- if (typeof file2 !== "string") {
71
- return file2;
72
- }
73
- const { content: base64, basename, mime } = await this.triggerCommand("__vitest_fileInfo", file2, "base64");
74
- const fileInstance = fetch(`data:${mime};base64,${base64}`).then((r) => r.blob()).then((blob) => new File([blob], basename, { type: mime }));
75
- return fileInstance;
76
- });
77
- const uploadFiles = await Promise.all(uploadPromise);
78
- return ensureAwaited(() => userEvent.upload(this.element(), uploadFiles));
67
+ return userEvent.upload(this.element(), file);
79
68
  }
80
69
  selectOptions(options_) {
81
- const options = (Array.isArray(options_) ? options_ : [options_]).map((option) => {
82
- if (typeof option !== "string" && "element" in option) {
83
- return option.element();
84
- }
85
- return option;
86
- });
87
- return ensureAwaited(() => userEvent.selectOptions(this.element(), options));
88
- }
89
- async dropTo() {
90
- throw new Error('The "preview" provider doesn\'t support `dropTo` method.');
70
+ return userEvent.selectOptions(this.element(), options_);
91
71
  }
92
72
  clear() {
93
- return ensureAwaited(() => userEvent.clear(this.element()));
94
- }
95
- async screenshot() {
96
- throw new Error('The "preview" provider doesn\'t support `screenshot` method.');
73
+ return userEvent.clear(this.element());
97
74
  }
98
75
  locator(selector) {
99
76
  return new PreviewLocator(`${this._pwSelector} >> ${selector}`, this._container);
@@ -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-CKtADM3n.js';
3
+ import { s as selectorEngine, L as Locator, c as convertElementToCssSelector } from '../index-VFFcOojA.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "3.0.0-beta.1",
4
+ "version": "3.0.0-beta.3",
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.1"
68
+ "vitest": "3.0.0-beta.3"
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.6",
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.1",
90
- "@vitest/utils": "3.0.0-beta.1"
89
+ "@vitest/mocker": "3.0.0-beta.3",
90
+ "@vitest/utils": "3.0.0-beta.3"
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",
99
+ "mime": "^4.0.6",
100
100
  "pathe": "^1.1.2",
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.1",
107
- "@vitest/runner": "3.0.0-beta.1",
108
- "@vitest/ws-client": "3.0.0-beta.1",
109
- "vitest": "3.0.0-beta.1"
105
+ "webdriverio": "^8.41.0",
106
+ "@vitest/runner": "3.0.0-beta.3",
107
+ "@vitest/ui": "3.0.0-beta.3",
108
+ "@vitest/ws-client": "3.0.0-beta.3",
109
+ "vitest": "3.0.0-beta.3"
110
110
  },
111
111
  "scripts": {
112
112
  "build": "rimraf dist && pnpm build:node && pnpm build:client",
@@ -2,7 +2,7 @@ import type { RemoteOptions, ClickOptions, DragAndDropOptions } from 'webdriveri
2
2
  import '../matchers.js'
3
3
 
4
4
  declare module 'vitest/node' {
5
- interface BrowserProviderOptions extends RemoteOptions {}
5
+ interface BrowserProviderOptions extends Partial<RemoteOptions> {}
6
6
 
7
7
  export interface UserEventClickOptions extends ClickOptions {}
8
8