@vitest/browser 4.0.0-beta.13 → 4.0.0-beta.15

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.
Files changed (35) hide show
  1. package/context.d.ts +50 -9
  2. package/context.js +3 -2
  3. package/dist/client/.vite/manifest.json +2 -2
  4. package/dist/client/__vitest__/assets/{index-C15NF4dG.js → index-CKAjAT2u.js} +1 -1
  5. package/dist/client/__vitest__/index.html +1 -1
  6. package/dist/client/__vitest_browser__/{orchestrator-Pdu7HCGX.js → orchestrator-Ce7D5fGP.js} +8 -6
  7. package/dist/client/__vitest_browser__/{tester-DYNLfPFH.js → tester-Vm4ppAv-.js} +4 -1
  8. package/dist/client/orchestrator.html +1 -1
  9. package/dist/client/tester/tester.html +1 -1
  10. package/dist/client.js +1 -1
  11. package/dist/context.js +70 -12
  12. package/dist/expect-element.js +1 -1
  13. package/dist/{public-utils-B6exS8fl.js → index-BnLTaCRv.js} +3 -3
  14. package/dist/index.d.ts +36 -172
  15. package/dist/index.js +515 -1487
  16. package/dist/{locators/index.d.ts → locators.d.ts} +25 -2
  17. package/dist/locators.js +1 -0
  18. package/jest-dom.d.ts +5 -5
  19. package/matchers.d.ts +1 -1
  20. package/package.json +11 -33
  21. package/utils.d.ts +5 -5
  22. package/dist/index-BPDFwkoW.js +0 -1
  23. package/dist/index-CwoiDq7G.js +0 -6
  24. package/dist/locators/index.js +0 -1
  25. package/dist/locators/playwright.js +0 -1
  26. package/dist/locators/preview.js +0 -1
  27. package/dist/locators/webdriverio.js +0 -1
  28. package/dist/providers/playwright.d.ts +0 -105
  29. package/dist/providers/playwright.js +0 -385
  30. package/dist/providers/preview.d.ts +0 -16
  31. package/dist/providers/preview.js +0 -44
  32. package/dist/providers/webdriverio.d.ts +0 -51
  33. package/dist/providers/webdriverio.js +0 -206
  34. package/dist/utils.js +0 -1
  35. package/providers.d.ts +0 -7
@@ -1,4 +1,4 @@
1
- import { UserEventClickOptions, UserEventClearOptions, UserEventHoverOptions, UserEventFillOptions, UserEventUploadOptions, UserEventDragAndDropOptions, UserEventSelectOptions, LocatorScreenshotOptions, LocatorByRoleOptions, LocatorOptions } from '@vitest/browser/context';
1
+ import { UserEventClickOptions, UserEventClearOptions, UserEventHoverOptions, UserEventFillOptions, UserEventUploadOptions, UserEventDragAndDropOptions, UserEventSelectOptions, LocatorScreenshotOptions, LocatorByRoleOptions, LocatorOptions } from 'vitest/browser';
2
2
 
3
3
  type ClauseCombinator = '' | '>' | '+' | '~' | '>=';
4
4
  type CSSFunctionArgument = CSSComplexSelector | number | string;
@@ -181,6 +181,23 @@ interface ByRoleOptions {
181
181
  pressed?: boolean;
182
182
  selected?: boolean;
183
183
  }
184
+ declare function getByTestIdSelector(testIdAttributeName: string, testId: string | RegExp): string;
185
+ declare function getByLabelSelector(text: string | RegExp, options?: {
186
+ exact?: boolean;
187
+ }): string;
188
+ declare function getByAltTextSelector(text: string | RegExp, options?: {
189
+ exact?: boolean;
190
+ }): string;
191
+ declare function getByTitleSelector(text: string | RegExp, options?: {
192
+ exact?: boolean;
193
+ }): string;
194
+ declare function getByPlaceholderSelector(text: string | RegExp, options?: {
195
+ exact?: boolean;
196
+ }): string;
197
+ declare function getByTextSelector(text: string | RegExp, options?: {
198
+ exact?: boolean;
199
+ }): string;
200
+ declare function getByRoleSelector(role: string, options?: ByRoleOptions): string;
184
201
 
185
202
  /**
186
203
  * Copyright (c) Microsoft Corporation.
@@ -279,6 +296,12 @@ interface SelectorEngine {
279
296
  queryAll: (root: SelectorRoot, selector: string | any) => Element[];
280
297
  }
281
298
 
299
+ declare function convertElementToCssSelector(element: Element): string;
300
+ declare function processTimeoutOptions<T extends {
301
+ timeout?: number;
302
+ }>(options_?: T): T | undefined;
303
+ declare function getIframeScale(): number;
304
+
282
305
  declare const selectorEngine: Ivya;
283
306
  declare abstract class Locator {
284
307
  abstract selector: string;
@@ -328,4 +351,4 @@ declare abstract class Locator {
328
351
  protected triggerCommand<T>(command: string, ...args: any[]): Promise<T>;
329
352
  }
330
353
 
331
- export { Locator, selectorEngine };
354
+ export { Locator, convertElementToCssSelector, getByAltTextSelector, getByLabelSelector, getByPlaceholderSelector, getByRoleSelector, getByTestIdSelector, getByTextSelector, getByTitleSelector, getIframeScale, processTimeoutOptions, selectorEngine };
@@ -0,0 +1 @@
1
+ export{L as Locator,o as convertElementToCssSelector,r as getByAltTextSelector,t as getByLabelSelector,u as getByPlaceholderSelector,v as getByRoleSelector,w as getByTestIdSelector,x as getByTextSelector,y as getByTitleSelector,q as getIframeScale,p as processTimeoutOptions,s as selectorEngine}from"./index-BnLTaCRv.js";import"vitest/browser";import"vitest/internal/browser";
package/jest-dom.d.ts CHANGED
@@ -23,7 +23,7 @@ export interface TestingLibraryMatchers<E, R> {
23
23
  * This matcher calculates the intersection ratio between the element and the viewport, similar to the
24
24
  * IntersectionObserver API.
25
25
  *
26
- * The element must be in the document and have visible dimensions. Elements with display: none or
26
+ * The element must be in the document and have visible dimensions. Elements with display: none or
27
27
  * visibility: hidden are considered not in viewport.
28
28
  * @example
29
29
  * <div
@@ -34,7 +34,7 @@ export interface TestingLibraryMatchers<E, R> {
34
34
  * </div>
35
35
  *
36
36
  * <div
37
- * data-testid="hidden-element"
37
+ * data-testid="hidden-element"
38
38
  * style="position: fixed; top: -100px; left: 10px; width: 50px; height: 50px;"
39
39
  * >
40
40
  * Hidden Element
@@ -49,13 +49,13 @@ export interface TestingLibraryMatchers<E, R> {
49
49
  *
50
50
  * // Check if any part of element is in viewport
51
51
  * await expect.element(page.getByTestId('visible-element')).toBeInViewport()
52
- *
52
+ *
53
53
  * // Check if element is outside viewport
54
54
  * await expect.element(page.getByTestId('hidden-element')).not.toBeInViewport()
55
- *
55
+ *
56
56
  * // Check if at least 50% of element is visible
57
57
  * await expect.element(page.getByTestId('large-element')).toBeInViewport({ ratio: 0.5 })
58
- *
58
+ *
59
59
  * // Check if element is completely visible
60
60
  * await expect.element(page.getByTestId('visible-element')).toBeInViewport({ ratio: 1 })
61
61
  * @see https://vitest.dev/guide/browser/assertion-api#tobeinviewport
package/matchers.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Locator } from '@vitest/browser/context'
1
+ import type { Locator } from './context.js'
2
2
  import type { TestingLibraryMatchers } from './jest-dom.js'
3
3
  import type { Assertion, ExpectPollOptions } from 'vitest'
4
4
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "4.0.0-beta.13",
4
+ "version": "4.0.0-beta.15",
5
5
  "description": "Browser running for Vitest",
6
6
  "license": "MIT",
7
7
  "funding": "https://opencollective.com/vitest",
@@ -20,10 +20,6 @@
20
20
  "types": "./dist/index.d.ts",
21
21
  "default": "./dist/index.js"
22
22
  },
23
- "./providers/*": {
24
- "types": "./dist/providers/*.d.ts",
25
- "default": "./dist/providers/*.js"
26
- },
27
23
  "./context": {
28
24
  "types": "./context.d.ts",
29
25
  "default": "./context.js"
@@ -35,15 +31,15 @@
35
31
  "types": "./matchers.d.ts",
36
32
  "default": "./dummy.js"
37
33
  },
38
- "./locator": {
39
- "types": "./dist/locators/index.d.ts",
40
- "default": "./dist/locators/index.js"
34
+ "./locators": {
35
+ "types": "./dist/locators.d.ts",
36
+ "default": "./dist/locators.js"
41
37
  },
42
38
  "./utils": {
43
39
  "types": "./utils.d.ts",
44
40
  "default": "./dist/utils.js"
45
41
  },
46
- "./*": "./*"
42
+ "./package.json": "./package.json"
47
43
  },
48
44
  "main": "./dist/index.js",
49
45
  "module": "./dist/index.js",
@@ -56,47 +52,29 @@
56
52
  "providers"
57
53
  ],
58
54
  "peerDependencies": {
59
- "playwright": "*",
60
- "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0",
61
- "vitest": "4.0.0-beta.13"
62
- },
63
- "peerDependenciesMeta": {
64
- "playwright": {
65
- "optional": true
66
- },
67
- "safaridriver": {
68
- "optional": true
69
- },
70
- "webdriverio": {
71
- "optional": true
72
- }
55
+ "vitest": "4.0.0-beta.15"
73
56
  },
74
57
  "dependencies": {
75
- "@testing-library/dom": "^10.4.1",
76
- "@testing-library/user-event": "^14.6.1",
77
58
  "magic-string": "^0.30.19",
78
59
  "pixelmatch": "7.1.0",
79
60
  "pngjs": "^7.0.0",
80
61
  "sirv": "^3.0.2",
81
62
  "tinyrainbow": "^3.0.3",
82
63
  "ws": "^8.18.3",
83
- "@vitest/mocker": "4.0.0-beta.13",
84
- "@vitest/utils": "4.0.0-beta.13"
64
+ "@vitest/mocker": "4.0.0-beta.15",
65
+ "@vitest/utils": "4.0.0-beta.15"
85
66
  },
86
67
  "devDependencies": {
68
+ "@testing-library/user-event": "^14.6.1",
87
69
  "@types/pngjs": "^6.0.5",
88
70
  "@types/ws": "^8.18.1",
89
- "@wdio/types": "^9.19.2",
90
71
  "birpc": "^2.5.0",
91
72
  "flatted": "^3.3.3",
92
73
  "ivya": "^1.7.0",
93
74
  "mime": "^4.1.0",
94
75
  "pathe": "^2.0.3",
95
- "playwright": "^1.55.0",
96
- "playwright-core": "^1.55.0",
97
- "webdriverio": "^9.19.2",
98
- "@vitest/runner": "4.0.0-beta.13",
99
- "vitest": "4.0.0-beta.13"
76
+ "@vitest/runner": "4.0.0-beta.15",
77
+ "vitest": "4.0.0-beta.15"
100
78
  },
101
79
  "scripts": {
102
80
  "typecheck": "tsc -p ./src/client/tsconfig.json --noEmit",
package/utils.d.ts CHANGED
@@ -1,21 +1,21 @@
1
- // should be in sync with tester/public-utils.ts
2
- // we cannot bundle it because vitest depend on the @vitest/browser and vice versa
3
- // fortunately, the file is quite small
4
-
5
- import { LocatorSelectors, Locator } from '@vitest/browser/context'
1
+ import { LocatorSelectors, Locator } from './context'
6
2
  import { StringifyOptions } from 'vitest/internal/browser'
7
3
 
8
4
  export type PrettyDOMOptions = Omit<StringifyOptions, 'maxLength'>
9
5
 
6
+ /** @deprecated use `import('vitest/browser').utils.getElementLocatorSelectors` instead */
10
7
  export declare function getElementLocatorSelectors(element: Element): LocatorSelectors
8
+ /** @deprecated use `import('vitest/browser').utils.debug` instead */
11
9
  export declare function debug(
12
10
  el?: Element | Locator | null | (Element | Locator)[],
13
11
  maxLength?: number,
14
12
  options?: PrettyDOMOptions,
15
13
  ): void
14
+ /** @deprecated use `import('vitest/browser').utils.prettyDOM` instead */
16
15
  export declare function prettyDOM(
17
16
  dom?: Element | Locator | undefined | null,
18
17
  maxLength?: number,
19
18
  prettyFormatOptions?: PrettyDOMOptions,
20
19
  ): string
20
+ /** @deprecated use `import('vitest/browser').utils.getElementError` instead */
21
21
  export declare function getElementError(selector: string, container?: Element): Error
@@ -1 +0,0 @@
1
- import{server,page}from"@vitest/browser/context";import{I as Ivya,e as getByRoleSelector,c as getByAltTextSelector,f as getByLabelSelector,b as getByPlaceholderSelector,d as getByTestIdSelector,a as getByTextSelector,g as getByTitleSelector,h as getElementError}from"./public-utils-B6exS8fl.js";function ensureAwaited(e){let S=getWorkerState().current;if(!S||S.type!==`test`)return e();let C=!1,w=Error(`STACK_TRACE_ERROR`);S.onFinished??=[],S.onFinished.push(()=>{if(!C){let e=Error(`The call was not awaited. This method is asynchronous and must be awaited; otherwise, the call will not start to avoid unhandled rejections.`);throw e.stack=w.stack?.replace(w.message,e.message),e}});let T;return{then(S,E){return C=!0,(T||=e(w)).then(S,E)},catch(S){return(T||=e(w)).catch(S)},finally(S){return(T||=e(w)).finally(S)},[Symbol.toStringTag]:`Promise`}}function getBrowserState(){return window.__vitest_browser_runner__}function getWorkerState(){let e=window.__vitest_worker__;if(!e)throw Error(`Worker state is not found. This is an issue with Vitest. Please, open an issue.`);return e}const provider=getBrowserState().provider;function convertElementToCssSelector(e){if(!e||!(e instanceof Element))throw Error(`Expected DOM element to be an instance of Element, received ${typeof e}`);return getUniqueCssSelector(e)}function escapeIdForCSSSelector(e){return e.split(``).map(e=>{let S=e.charCodeAt(0);return e===` `||e===`#`||e===`.`||e===`:`||e===`[`||e===`]`||e===`>`||e===`+`||e===`~`||e===`\\`?`\\${e}`:S>=65536?`\\${S.toString(16).toUpperCase().padStart(6,`0`)} `:S<32||S===127||S>=128?`\\${S.toString(16).toUpperCase().padStart(2,`0`)} `:e}).join(``)}function getUniqueCssSelector(e){let S=[],C,w=!1;for(;C=getParent(e);){C.shadowRoot&&(w=!0);let T=e.tagName;if(e.id)S.push(`#${escapeIdForCSSSelector(e.id)}`);else if(!e.nextElementSibling&&!e.previousElementSibling)S.push(T.toLowerCase());else{let w=0,E=0,D=0;for(let S of C.children)w++,S.tagName===T&&E++,S===e&&(D=w);E>1?S.push(`${T.toLowerCase()}:nth-child(${D})`):S.push(T.toLowerCase())}e=C}return`${getBrowserState().provider===`webdriverio`&&w?`>>>`:``}${S.reverse().join(` > `)}`}function getParent(e){let S=e.parentNode;return S instanceof ShadowRoot?S.host:S}const now=Date.now;function processTimeoutOptions(e){if(e&&e.timeout!=null||provider!==`playwright`||getWorkerState().config.browser.providerOptions.actionTimeout!=null)return e;let S=getBrowserState().runner,C=S._currentTaskStartTime;if(!C)return e;let w=S._currentTaskTimeout;if(w===0||w==null||w===1/0)return e;e||={};let T=now(),E=C+w-T;return E<=0||(e.timeout=E-100),e}function getIframeScale(){let e=window.parent.document.querySelector(`iframe[data-vitest]`)?.parentElement;if(!e)throw Error(`Cannot find Tester element. This is a bug in Vitest. Please, open a new issue with reproduction.`);let S=e.getAttribute(`data-scale`),C=Number(S);if(Number.isNaN(C))throw TypeError(`Cannot parse scale value from Tester element (${S}). This is a bug in Vitest. Please, open a new issue with reproduction.`);return C}function escapeRegexForSelector(e){return e.unicode||e.unicodeSets?String(e):String(e).replace(/(^|[^\\])(\\\\)*(["'`])/g,`$1$2\\$3`).replace(/>>/g,`\\>\\>`)}function escapeForTextSelector(e,S){return typeof e==`string`?`${JSON.stringify(e)}i`:escapeRegexForSelector(e)}function convertToSelector(e){if(!e)throw Error(`Expected element or locator to be defined.`);if(e instanceof Element)return convertElementToCssSelector(e);if(`selector`in e)return e.selector;throw Error(`Expected element or locator to be an instance of Element or Locator.`)}const selectorEngine=Ivya.create({browser:(e=>{switch(e){case`edge`:case`chrome`:return`chromium`;case`safari`:return`webkit`;default:return e}})(server.config.browser.name),testIdAttribute:server.config.browser.locators.testIdAttribute}),kLocator=Symbol.for(`$$vitest:locator`);class Locator{_parsedSelector;_container;_pwSelector;constructor(){Object.defineProperty(this,kLocator,{enumerable:!1,writable:!1,configurable:!1,value:kLocator})}click(e={}){return this.triggerCommand(`__vitest_click`,this.selector,e)}dblClick(e={}){return this.triggerCommand(`__vitest_dblClick`,this.selector,e)}tripleClick(e={}){return this.triggerCommand(`__vitest_tripleClick`,this.selector,e)}clear(e){return this.triggerCommand(`__vitest_clear`,this.selector,e)}hover(e){return this.triggerCommand(`__vitest_hover`,this.selector,e)}unhover(e){return this.triggerCommand(`__vitest_hover`,`html > body`,e)}fill(e,S){return this.triggerCommand(`__vitest_fill`,this.selector,e,S)}async upload(e,S){let C=(Array.isArray(e)?e:[e]).map(async e=>{if(typeof e==`string`)return e;let S=await new Promise((S,C)=>{let w=new FileReader;w.onload=()=>S(w.result),w.onerror=()=>C(Error(`Failed to read file: ${e.name}`)),w.readAsDataURL(e)});return{name:e.name,mimeType:e.type,base64:S}});return this.triggerCommand(`__vitest_upload`,this.selector,await Promise.all(C),S)}dropTo(e,S={}){return this.triggerCommand(`__vitest_dragAndDrop`,this.selector,e.selector,S)}selectOptions(e,S){let C=(Array.isArray(e)?e:[e]).map(e=>typeof e==`string`?e:{element:`element`in e?e.selector:selectorEngine.generateSelectorSimple(e)});return this.triggerCommand(`__vitest_selectOptions`,this.selector,C,S)}screenshot(e){return page.screenshot({...e,element:this})}getByRole(e,S){return this.locator(getByRoleSelector(e,S))}getByAltText(e,S){return this.locator(getByAltTextSelector(e,S))}getByLabelText(e,S){return this.locator(getByLabelSelector(e,S))}getByPlaceholder(e,S){return this.locator(getByPlaceholderSelector(e,S))}getByTestId(S){return this.locator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,S))}getByText(e,S){return this.locator(getByTextSelector(e,S))}getByTitle(e,S){return this.locator(getByTitleSelector(e,S))}filter(e){let S=[];if(e?.hasText&&S.push(`internal:has-text=${escapeForTextSelector(e.hasText)}`),e?.hasNotText&&S.push(`internal:has-not-text=${escapeForTextSelector(e.hasNotText)}`),e?.has){let C=e.has;S.push(`internal:has=${JSON.stringify(C._pwSelector||C.selector)}`)}if(e?.hasNot){let C=e.hasNot;S.push(`internal:has-not=${JSON.stringify(C._pwSelector||C.selector)}`)}if(!S.length)throw Error(`Locator.filter expects at least one filter. None provided.`);return this.locator(S.join(` >> `))}and(e){return this.locator(`internal:and=${JSON.stringify(e._pwSelector||e.selector)}`)}or(e){return this.locator(`internal:or=${JSON.stringify(e._pwSelector||e.selector)}`)}query(){let e=this._parsedSelector||=selectorEngine.parseSelector(this._pwSelector||this.selector);return selectorEngine.querySelector(e,document.documentElement,!0)}element(){let e=this.query();if(!e)throw getElementError(this._pwSelector||this.selector,this._container||document.body);return e}elements(){let e=this._parsedSelector||=selectorEngine.parseSelector(this._pwSelector||this.selector);return selectorEngine.querySelectorAll(e,document.documentElement)}get length(){return this.elements().length}all(){return this.elements().map(e=>this.elementLocator(e))}nth(e){return this.locator(`nth=${e}`)}first(){return this.nth(0)}last(){return this.nth(-1)}toString(){return this.selector}toJSON(){return this.selector}triggerCommand(e,...S){let C=getBrowserState().commands;return ensureAwaited(w=>C.triggerCommand(e,S,w))}}export{Locator as L,getBrowserState as a,getWorkerState as b,convertElementToCssSelector as c,convertToSelector as d,getIframeScale as g,processTimeoutOptions as p,selectorEngine as s};
@@ -1,6 +0,0 @@
1
- export { playwright } from './providers/playwright.js';
2
- export { preview } from './providers/preview.js';
3
- export { webdriverio } from './providers/webdriverio.js';
4
- import '@vitest/mocker/node';
5
- import 'tinyrainbow';
6
- import 'vitest/node';
@@ -1 +0,0 @@
1
- import"@vitest/browser/context";import"../public-utils-B6exS8fl.js";export{L as Locator,s as selectorEngine}from"../index-BPDFwkoW.js";import"vitest/internal/browser";
@@ -1 +0,0 @@
1
- import{page,server}from"@vitest/browser/context";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-B6exS8fl.js";import{s as selectorEngine,L as Locator,p as processTimeoutOptions,g as getIframeScale}from"../index-BPDFwkoW.js";import"vitest/internal/browser";page.extend({getByLabelText(e,_){return new PlaywrightLocator(getByLabelSelector(e,_))},getByRole(e,_){return new PlaywrightLocator(getByRoleSelector(e,_))},getByTestId(e){return new PlaywrightLocator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,e))},getByAltText(e,_){return new PlaywrightLocator(getByAltTextSelector(e,_))},getByPlaceholder(e,_){return new PlaywrightLocator(getByPlaceholderSelector(e,_))},getByText(e,_){return new PlaywrightLocator(getByTextSelector(e,_))},getByTitle(e,_){return new PlaywrightLocator(getByTitleSelector(e,_))},_createLocator(e){return new PlaywrightLocator(e)},elementLocator(e){return new PlaywrightLocator(selectorEngine.generateSelectorSimple(e),e)},frameLocator(e){return new PlaywrightLocator(`${e.selector} >> internal:control=enter-frame`)}});class PlaywrightLocator extends Locator{constructor(e,_){super(),this.selector=e,this._container=_}click(e){return super.click(processTimeoutOptions(processClickOptions(e)))}dblClick(e){return super.dblClick(processTimeoutOptions(processClickOptions(e)))}tripleClick(e){return super.tripleClick(processTimeoutOptions(processClickOptions(e)))}selectOptions(e,_){return super.selectOptions(e,processTimeoutOptions(_))}clear(e){return super.clear(processTimeoutOptions(e))}hover(e){return super.hover(processTimeoutOptions(processHoverOptions(e)))}upload(e,_){return super.upload(e,processTimeoutOptions(_))}fill(e,_){return super.fill(e,processTimeoutOptions(_))}dropTo(e,_){return super.dropTo(e,processTimeoutOptions(processDragAndDropOptions(_)))}locator(e){return new PlaywrightLocator(`${this.selector} >> ${e}`,this._container)}elementLocator(e){return new PlaywrightLocator(selectorEngine.generateSelectorSimple(e),e)}}function processDragAndDropOptions(e){if(!e)return e;let _=e;return _.sourcePosition&&=processPlaywrightPosition(_.sourcePosition),_.targetPosition&&=processPlaywrightPosition(_.targetPosition),e}function processHoverOptions(e){if(!e)return e;let _=e;return _.position&&=processPlaywrightPosition(_.position),e}function processClickOptions(e){if(!e)return e;let _=e;return _.position&&=processPlaywrightPosition(_.position),_}function processPlaywrightPosition(e){let _=getIframeScale();return e.x!=null&&(e.x*=_),e.y!=null&&(e.y*=_),e}
@@ -1 +0,0 @@
1
- import{page,server,userEvent}from"@vitest/browser/context";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-B6exS8fl.js";import{s as selectorEngine,L as Locator,c as convertElementToCssSelector}from"../index-BPDFwkoW.js";import"vitest/internal/browser";page.extend({getByLabelText(e,m){return new PreviewLocator(getByLabelSelector(e,m))},getByRole(e,m){return new PreviewLocator(getByRoleSelector(e,m))},getByTestId(e){return new PreviewLocator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,e))},getByAltText(e,m){return new PreviewLocator(getByAltTextSelector(e,m))},getByPlaceholder(e,m){return new PreviewLocator(getByPlaceholderSelector(e,m))},getByText(e,m){return new PreviewLocator(getByTextSelector(e,m))},getByTitle(e,m){return new PreviewLocator(getByTitleSelector(e,m))},_createLocator(e){return new PreviewLocator(e)},elementLocator(e){return new PreviewLocator(selectorEngine.generateSelectorSimple(e),e)}});class PreviewLocator extends Locator{constructor(e,m){super(),this._pwSelector=e,this._container=m}get selector(){let e=this.elements().map(e=>convertElementToCssSelector(e));if(!e.length)throw getElementError(this._pwSelector,this._container||document.body);return e.join(`, `)}click(){return userEvent.click(this.element())}dblClick(){return userEvent.dblClick(this.element())}tripleClick(){return userEvent.tripleClick(this.element())}hover(){return userEvent.hover(this.element())}unhover(){return userEvent.unhover(this.element())}async fill(e){return userEvent.fill(this.element(),e)}async upload(e){return userEvent.upload(this.element(),e)}selectOptions(e){return userEvent.selectOptions(this.element(),e)}clear(){return userEvent.clear(this.element())}locator(e){return new PreviewLocator(`${this._pwSelector} >> ${e}`,this._container)}elementLocator(e){return new PreviewLocator(selectorEngine.generateSelectorSimple(e),e)}}
@@ -1 +0,0 @@
1
- import{page,server}from"@vitest/browser/context";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-B6exS8fl.js";import{s as selectorEngine,L as Locator,c as convertElementToCssSelector,a as getBrowserState,g as getIframeScale}from"../index-BPDFwkoW.js";import"vitest/internal/browser";page.extend({getByLabelText(e,g){return new WebdriverIOLocator(getByLabelSelector(e,g))},getByRole(e,g){return new WebdriverIOLocator(getByRoleSelector(e,g))},getByTestId(e){return new WebdriverIOLocator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,e))},getByAltText(e,g){return new WebdriverIOLocator(getByAltTextSelector(e,g))},getByPlaceholder(e,g){return new WebdriverIOLocator(getByPlaceholderSelector(e,g))},getByText(e,g){return new WebdriverIOLocator(getByTextSelector(e,g))},getByTitle(e,g){return new WebdriverIOLocator(getByTitleSelector(e,g))},_createLocator(e){return new WebdriverIOLocator(e)},elementLocator(e){return new WebdriverIOLocator(selectorEngine.generateSelectorSimple(e))}});class WebdriverIOLocator extends Locator{constructor(e,g){super(),this._pwSelector=e,this._container=g}get selector(){let e=this.elements().map(e=>convertElementToCssSelector(e));if(!e.length)throw getElementError(this._pwSelector,this._container||document.body);let g=!1,_=e.map(e=>e.startsWith(`>>>`)?(g=!0,e.slice(3)):e);return(g?`>>>`:``)+_.join(`, `)}click(e){return super.click(processClickOptions(e))}dblClick(e){return super.dblClick(processClickOptions(e))}tripleClick(e){return super.tripleClick(processClickOptions(e))}selectOptions(e,g){let _=getWebdriverioSelectOptions(this.element(),e);return this.triggerCommand(`__vitest_selectOptions`,this.selector,_,g)}hover(e){return super.hover(processHoverOptions(e))}dropTo(e,g){return super.dropTo(e,processDragAndDropOptions(g))}locator(e){return new WebdriverIOLocator(`${this._pwSelector} >> ${e}`,this._container)}elementLocator(e){return new WebdriverIOLocator(selectorEngine.generateSelectorSimple(e),e)}}function getWebdriverioSelectOptions(e,g){let _=[...e.querySelectorAll(`option`)],v=Array.isArray(g)?g:[g];if(!v.length)return[];if(v.length>1)throw Error(`Provider "webdriverio" doesn't support selecting multiple values at once`);let y=v[0];if(typeof y!=`string`){let e=`element`in y?y.element():y,g=_.indexOf(e);if(g===-1)throw Error(`The element ${selectorEngine.previewNode(e)} was not found in the "select" options.`);return[{index:g}]}let b=_.findIndex(e=>e.value===y);if(b!==-1)return[{index:b}];let x=_.findIndex(e=>e.textContent?.trim()===y||e.ariaLabel===y);if(x===-1)throw Error(`The option "${y}" was not found in the "select" options.`);return[{index:x}]}function processClickOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g=e;if(g.x!=null||g.y!=null){let e={};g.x!=null&&(g.x=scaleCoordinate(g.x,e)),g.y!=null&&(g.y=scaleCoordinate(g.y,e))}return e}function processHoverOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g=e,_={};return g.xOffset!=null&&(g.xOffset=scaleCoordinate(g.xOffset,_)),g.yOffset!=null&&(g.yOffset=scaleCoordinate(g.yOffset,_)),e}function processDragAndDropOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g={},_=e;return _.sourceX!=null&&(_.sourceX=scaleCoordinate(_.sourceX,g)),_.sourceY!=null&&(_.sourceY=scaleCoordinate(_.sourceY,g)),_.targetX!=null&&(_.targetX=scaleCoordinate(_.targetX,g)),_.targetY!=null&&(_.targetY=scaleCoordinate(_.targetY,g)),e}function scaleCoordinate(e,g){return Math.round(e*getCachedScale(g))}function getCachedScale(e){return e.scale??=getIframeScale()}
@@ -1,105 +0,0 @@
1
- import { ScreenshotMatcherOptions, ScreenshotComparatorRegistry } from '@vitest/browser/context';
2
- import { Page, Frame, FrameLocator, BrowserContext, LaunchOptions, ConnectOptions, BrowserContextOptions, Browser } from 'playwright';
3
- import { Protocol } from 'playwright-core/types/protocol';
4
- import { BrowserProviderOption, BrowserProvider, BrowserModuleMocker, TestProject, CDPSession } from 'vitest/node';
5
-
6
- declare const playwrightBrowsers: readonly ["firefox", "webkit", "chromium"];
7
- type PlaywrightBrowser = (typeof playwrightBrowsers)[number];
8
- interface PlaywrightProviderOptions {
9
- /**
10
- * The options passed down to [`playwright.connect`](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) method.
11
- * @see {@link https://playwright.dev/docs/api/class-browsertype#browser-type-launch}
12
- */
13
- launchOptions?: Omit<LaunchOptions, "tracesDir">;
14
- /**
15
- * The options passed down to [`playwright.connect`](https://playwright.dev/docs/api/class-browsertype#browser-type-connect) method.
16
- *
17
- * This is used only if you connect remotely to the playwright instance via a WebSocket connection.
18
- * @see {@link https://playwright.dev/docs/api/class-browsertype#browser-type-connect}
19
- */
20
- connectOptions?: ConnectOptions & {
21
- wsEndpoint: string;
22
- };
23
- /**
24
- * The options passed down to [`browser.newContext`](https://playwright.dev/docs/api/class-browser#browser-new-context) method.
25
- * @see {@link https://playwright.dev/docs/api/class-browser#browser-new-context}
26
- */
27
- contextOptions?: Omit<BrowserContextOptions, "ignoreHTTPSErrors" | "serviceWorkers">;
28
- /**
29
- * The maximum time in milliseconds to wait for `userEvent` action to complete.
30
- * @default 0 (no timeout)
31
- */
32
- actionTimeout?: number;
33
- }
34
- declare function playwright(options?: PlaywrightProviderOptions): BrowserProviderOption<PlaywrightProviderOptions>;
35
- declare class PlaywrightBrowserProvider implements BrowserProvider {
36
- private project;
37
- private options;
38
- name: "playwright";
39
- supportsParallelism: boolean;
40
- browser: Browser | null;
41
- contexts: Map<string, BrowserContext>;
42
- pages: Map<string, Page>;
43
- mocker: BrowserModuleMocker;
44
- browserName: PlaywrightBrowser;
45
- private browserPromise;
46
- private closing;
47
- tracingContexts: Set<string>;
48
- pendingTraces: Map<string, string>;
49
- constructor(project: TestProject, options: PlaywrightProviderOptions);
50
- private openBrowser;
51
- private createMocker;
52
- private createContext;
53
- getPage(sessionId: string): Page;
54
- getCommandsContext(sessionId: string): {
55
- page: Page;
56
- context: BrowserContext;
57
- frame: () => Promise<Frame>;
58
- readonly iframe: FrameLocator;
59
- };
60
- private openBrowserPage;
61
- openPage(sessionId: string, url: string, beforeNavigate?: () => Promise<void>): Promise<void>;
62
- private _throwIfClosing;
63
- getCDPSession(sessionid: string): Promise<CDPSession>;
64
- close(): Promise<void>;
65
- }
66
- declare module "vitest/node" {
67
- interface BrowserCommandContext {
68
- page: Page;
69
- frame(): Promise<Frame>;
70
- iframe: FrameLocator;
71
- context: BrowserContext;
72
- }
73
- interface ToMatchScreenshotOptions extends Omit<ScreenshotMatcherOptions, "comparatorName" | "comparatorOptions"> {}
74
- interface ToMatchScreenshotComparators extends ScreenshotComparatorRegistry {}
75
- }
76
- type PWHoverOptions = NonNullable<Parameters<Page["hover"]>[1]>;
77
- type PWClickOptions = NonNullable<Parameters<Page["click"]>[1]>;
78
- type PWDoubleClickOptions = NonNullable<Parameters<Page["dblclick"]>[1]>;
79
- type PWFillOptions = NonNullable<Parameters<Page["fill"]>[2]>;
80
- type PWScreenshotOptions = NonNullable<Parameters<Page["screenshot"]>[0]>;
81
- type PWSelectOptions = NonNullable<Parameters<Page["selectOption"]>[2]>;
82
- type PWDragAndDropOptions = NonNullable<Parameters<Page["dragAndDrop"]>[2]>;
83
- type PWSetInputFiles = NonNullable<Parameters<Page["setInputFiles"]>[2]>;
84
- declare module "@vitest/browser/context" {
85
- interface UserEventHoverOptions extends PWHoverOptions {}
86
- interface UserEventClickOptions extends PWClickOptions {}
87
- interface UserEventDoubleClickOptions extends PWDoubleClickOptions {}
88
- interface UserEventTripleClickOptions extends PWClickOptions {}
89
- interface UserEventFillOptions extends PWFillOptions {}
90
- interface UserEventSelectOptions extends PWSelectOptions {}
91
- interface UserEventDragAndDropOptions extends PWDragAndDropOptions {}
92
- interface UserEventUploadOptions extends PWSetInputFiles {}
93
- interface ScreenshotOptions extends Omit<PWScreenshotOptions, "mask"> {
94
- mask?: ReadonlyArray<Element | Locator> | undefined;
95
- }
96
- interface CDPSession {
97
- send<T extends keyof Protocol.CommandParameters>(method: T, params?: Protocol.CommandParameters[T]): Promise<Protocol.CommandReturnValues[T]>;
98
- on<T extends keyof Protocol.Events>(event: T, listener: (payload: Protocol.Events[T]) => void): this;
99
- once<T extends keyof Protocol.Events>(event: T, listener: (payload: Protocol.Events[T]) => void): this;
100
- off<T extends keyof Protocol.Events>(event: T, listener: (payload: Protocol.Events[T]) => void): this;
101
- }
102
- }
103
-
104
- export { PlaywrightBrowserProvider, playwright };
105
- export type { PlaywrightProviderOptions };