@vitest/browser 2.0.0-beta.10 → 2.0.0-beta.12

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/providers.js CHANGED
@@ -1,4 +1,4 @@
1
- import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-CXn0ag9T.js';
1
+ import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-CJA71Bgl.js';
2
2
 
3
3
  class PreviewBrowserProvider {
4
4
  name = "preview";
@@ -17,17 +17,21 @@ class PreviewBrowserProvider {
17
17
  async initialize(ctx) {
18
18
  this.ctx = ctx;
19
19
  this.open = false;
20
- if (ctx.config.browser.headless)
21
- throw new Error(`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`);
20
+ if (ctx.config.browser.headless) {
21
+ throw new Error(
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
+ );
24
+ }
22
25
  }
23
26
  async openPage(_contextId, url) {
24
27
  this.open = true;
25
- if (!this.ctx.browser)
28
+ if (!this.ctx.browser) {
26
29
  throw new Error("Browser is not initialized");
27
- const options = this.ctx.browser.config.server;
30
+ }
31
+ const options = this.ctx.browser.vite.config.server;
28
32
  const _open = options.open;
29
33
  options.open = url;
30
- this.ctx.browser.openBrowser();
34
+ this.ctx.browser.vite.openBrowser();
31
35
  options.open = _open;
32
36
  }
33
37
  async close() {
package/dist/state.js ADDED
@@ -0,0 +1 @@
1
+ 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,mockMap:new Map,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 error=err=>{window.dispatchEvent(new ErrorEvent("error",{error:err}))};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}
@@ -18,10 +18,12 @@ class PlaywrightBrowserProvider {
18
18
  this.options = options;
19
19
  }
20
20
  async openBrowser() {
21
- if (this.browserPromise)
21
+ if (this.browserPromise) {
22
22
  return this.browserPromise;
23
- if (this.browser)
23
+ }
24
+ if (this.browser) {
24
25
  return this.browser;
26
+ }
25
27
  this.browserPromise = (async () => {
26
28
  const options = this.ctx.config.browser;
27
29
  const playwright = await import('playwright');
@@ -36,8 +38,9 @@ class PlaywrightBrowserProvider {
36
38
  return this.browserPromise;
37
39
  }
38
40
  async createContext(contextId) {
39
- if (this.contexts.has(contextId))
41
+ if (this.contexts.has(contextId)) {
40
42
  return this.contexts.get(contextId);
43
+ }
41
44
  const browser = await this.openBrowser();
42
45
  const context = await browser.newContext({
43
46
  ...this.options?.context,
@@ -49,18 +52,34 @@ class PlaywrightBrowserProvider {
49
52
  }
50
53
  getPage(contextId) {
51
54
  const page = this.pages.get(contextId);
52
- if (!page)
55
+ if (!page) {
53
56
  throw new Error(`Page "${contextId}" not found`);
57
+ }
54
58
  return page;
55
59
  }
56
60
  getCommandsContext(contextId) {
57
61
  const page = this.getPage(contextId);
58
- const tester = page.frameLocator("iframe[data-vitest]");
59
62
  return {
60
63
  page,
61
- tester,
62
- get body() {
63
- return page.frameLocator("iframe[data-vitest]").locator("body");
64
+ context: this.contexts.get(contextId),
65
+ frame() {
66
+ return new Promise((resolve, reject) => {
67
+ const frame = page.frame("vitest-iframe");
68
+ if (frame) {
69
+ return resolve(frame);
70
+ }
71
+ const timeout = setTimeout(() => {
72
+ const err = new Error(`Cannot find "vitest-iframe" on the page. This is a bug in Vitest, please report it.`);
73
+ reject(err);
74
+ }, 1e3);
75
+ page.on("frameattached", (frame2) => {
76
+ clearTimeout(timeout);
77
+ resolve(frame2);
78
+ });
79
+ });
80
+ },
81
+ get iframe() {
82
+ return page.frameLocator('[data-vitest="true"]');
64
83
  }
65
84
  };
66
85
  }
@@ -73,12 +92,43 @@ class PlaywrightBrowserProvider {
73
92
  const context = await this.createContext(contextId);
74
93
  const page = await context.newPage();
75
94
  this.pages.set(contextId, page);
95
+ if (process.env.VITEST_PW_DEBUG) {
96
+ page.on("requestfailed", (request) => {
97
+ console.error(
98
+ "[PW Error]",
99
+ request.resourceType(),
100
+ "request failed for",
101
+ request.url(),
102
+ "url:",
103
+ request.failure()?.errorText
104
+ );
105
+ });
106
+ }
76
107
  return page;
77
108
  }
78
109
  async openPage(contextId, url) {
79
110
  const browserPage = await this.openBrowserPage(contextId);
80
111
  await browserPage.goto(url);
81
112
  }
113
+ async getCDPSession(contextId) {
114
+ const page = this.getPage(contextId);
115
+ const cdp = await page.context().newCDPSession(page);
116
+ return {
117
+ async send(method, params) {
118
+ const result = await cdp.send(method, params);
119
+ return result;
120
+ },
121
+ on(event, listener) {
122
+ cdp.on(event, listener);
123
+ },
124
+ off(event, listener) {
125
+ cdp.off(event, listener);
126
+ },
127
+ once(event, listener) {
128
+ cdp.once(event, listener);
129
+ }
130
+ };
131
+ }
82
132
  async close() {
83
133
  const browser = this.browser;
84
134
  this.browser = null;
@@ -108,7 +158,10 @@ class WebdriverBrowserProvider {
108
158
  }
109
159
  async beforeCommand() {
110
160
  const page = this.browser;
111
- const iframe = await page.findElement("css selector", "iframe[data-vitest]");
161
+ const iframe = await page.findElement(
162
+ "css selector",
163
+ "iframe[data-vitest]"
164
+ );
112
165
  await page.switchToFrame(iframe);
113
166
  }
114
167
  async afterCommand() {
@@ -120,12 +173,16 @@ class WebdriverBrowserProvider {
120
173
  };
121
174
  }
122
175
  async openBrowser() {
123
- if (this.browser)
176
+ if (this.browser) {
124
177
  return this.browser;
178
+ }
125
179
  const options = this.ctx.config.browser;
126
180
  if (this.browserName === "safari") {
127
- if (options.headless)
128
- throw new Error("You've enabled headless mode for Safari but it doesn't currently support it.");
181
+ if (options.headless) {
182
+ throw new Error(
183
+ "You've enabled headless mode for Safari but it doesn't currently support it."
184
+ );
185
+ }
129
186
  }
130
187
  const { remote } = await import('webdriverio');
131
188
  this.browser = await remote({