Skip to content

Commit 5cdeb55

Browse files
authored
feat!: move browser providers to @vitest/browser package (#4364)
1 parent 2af2ba7 commit 5cdeb55

File tree

29 files changed

+500
-666
lines changed

29 files changed

+500
-666
lines changed

.github/workflows/ci.yml

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -125,20 +125,23 @@ jobs:
125125
- uses: browser-actions/setup-chrome@v1
126126
- uses: browser-actions/setup-firefox@v1
127127
- uses: browser-actions/setup-edge@v1
128+
id: setup-edge
128129
with:
129-
edge-version: beta
130+
edge-version: stable
130131

131132
- name: Install
132133
run: pnpm i
133134

134135
- name: Install Playwright Dependencies
135-
run: pnpx playwright install-deps
136+
run: pnpx playwright install --with-deps
136137

137138
- name: Build
138139
run: pnpm run build
139140

140141
- name: Test Browser (webdriverio)
141142
run: pnpm run test:browser:webdriverio
143+
env:
144+
EDGEDRIVER_VERSION: ${{ steps.setup-edge.outputs.edge-version }}
142145

143146
- name: Test Browser (playwright)
144147
run: pnpm run test:browser:playwright
@@ -169,7 +172,7 @@ jobs:
169172
run: pnpm i
170173

171174
- name: Install Playwright Dependencies
172-
run: pnpx playwright install-deps
175+
run: pnpx playwright install --with-deps
173176

174177
- name: Build
175178
run: pnpm run build
@@ -181,29 +184,3 @@ jobs:
181184
run: pnpm run test:browser:playwright
182185
env:
183186
BROWSER: ${{ matrix.browser[1] }}
184-
185-
test-browser-safari:
186-
runs-on: macos-latest
187-
timeout-minutes: 30
188-
189-
steps:
190-
- uses: actions/checkout@v4
191-
192-
- uses: ./.github/actions/setup-and-cache
193-
with:
194-
node-version: 20
195-
196-
- name: Install
197-
run: sudo pnpm i --frozen-lockfile
198-
199-
- name: Build
200-
run: sudo pnpm run build
201-
202-
- name: Enable
203-
run: sudo safaridriver --enable
204-
205-
- name: Test Browser (webdriverio)
206-
run: sudo BROWSER=safari pnpm run test:browser:webdriverio
207-
208-
- name: Test Browser (playwright)
209-
run: sudo BROWSER=webkit pnpm run test:browser:playwright

docs/config/index.md

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1332,7 +1332,7 @@ Path to a provider that will be used when running browser tests. Vitest provides
13321332
export interface BrowserProvider {
13331333
name: string
13341334
getSupportedBrowsers(): readonly string[]
1335-
initialize(ctx: Vitest, options: { browser: string }): Awaitable<void>
1335+
initialize(ctx: Vitest, options: { browser: string; options?: BrowserProviderOptions }): Awaitable<void>
13361336
openPage(url: string): Awaitable<void>
13371337
close(): Awaitable<void>
13381338
}
@@ -1342,6 +1342,42 @@ export interface BrowserProvider {
13421342
This is an advanced API for library authors. If you just need to run tests in a browser, use the [browser](/config/#browser) option.
13431343
:::
13441344

1345+
#### browser.providerOptions
1346+
1347+
- **Type:** `BrowserProviderOptions`
1348+
- **Version:** Since Vitest 1.0.0-beta.3
1349+
1350+
Options that will be passed down to provider when calling `provider.initialize`.
1351+
1352+
```ts
1353+
export default defineConfig({
1354+
test: {
1355+
browser: {
1356+
providerOptions: {
1357+
launch: {
1358+
devtools: true,
1359+
}
1360+
}
1361+
}
1362+
}
1363+
})
1364+
```
1365+
1366+
::: tip
1367+
To have a better type safety when using built-in providers, you can add one of these types (for provider that you are using) to your tsconfig's `compilerOptions.types` field:
1368+
1369+
```json
1370+
{
1371+
"compilerOptions": {
1372+
"types": [
1373+
"@vitest/browser/providers/webdriverio",
1374+
"@vitest/browser/providers/playwright"
1375+
]
1376+
}
1377+
}
1378+
```
1379+
:::
1380+
13451381
#### browser.slowHijackESM
13461382

13471383
- **Type:** `boolean`

examples/playwright/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
"test:ui": "vite build && vitest --ui"
88
},
99
"devDependencies": {
10-
"@playwright/test": "^1.28.0",
10+
"@playwright/test": "^1.39.0",
1111
"@vitest/ui": "latest",
12-
"playwright": "^1.28.0",
12+
"playwright": "^1.39.0",
1313
"vite": "latest",
1414
"vitest": "latest"
1515
}

packages/browser/package.json

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,24 @@
2020
"types": "./dist/index.d.ts",
2121
"import": "./dist/index.js"
2222
},
23+
"./providers": {
24+
"types": "./providers.d.ts",
25+
"import": "./dist/providers.js"
26+
},
27+
"./providers/webdriverio": {
28+
"types": "./dist/providers/webdriverio.d.ts"
29+
},
30+
"./providers/playwright": {
31+
"types": "./dist/providers/playwright.d.ts"
32+
},
2333
"./*": "./*"
2434
},
2535
"main": "./dist/index.js",
2636
"module": "./dist/index.js",
2737
"types": "./dist/index.d.ts",
2838
"files": [
2939
"dist",
30-
"stubs"
40+
"providers"
3141
],
3242
"scripts": {
3343
"build": "rimraf dist && pnpm build:node && pnpm build:client",
@@ -39,7 +49,21 @@
3949
"prepublishOnly": "pnpm build"
4050
},
4151
"peerDependencies": {
42-
"vitest": "^1.0.0-0"
52+
"playwright": "*",
53+
"safaridriver": "*",
54+
"vitest": "^1.0.0-0",
55+
"webdriverio": "*"
56+
},
57+
"peerDependenciesMeta": {
58+
"webdriverio": {
59+
"optional": true
60+
},
61+
"safaridriver": {
62+
"optional": true
63+
},
64+
"playwright": {
65+
"optional": true
66+
}
4367
},
4468
"dependencies": {
4569
"estree-walker": "^3.0.3",
@@ -52,7 +76,12 @@
5276
"@vitest/runner": "workspace:*",
5377
"@vitest/ui": "workspace:*",
5478
"@vitest/ws-client": "workspace:*",
79+
"@wdio/protocols": "^8.18.0",
5580
"periscopic": "^3.1.0",
56-
"vitest": "workspace:*"
81+
"playwright": "^1.39.0",
82+
"playwright-core": "^1.39.0",
83+
"safaridriver": "^0.1.0",
84+
"vitest": "workspace:*",
85+
"webdriverio": "^8.20.0"
5786
}
5887
}

packages/browser/providers.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { BrowserProvider } from 'vitest/nide'
2+
3+
declare var webdriverio: BrowserProvider
4+
declare var playwright: BrowserProvider
5+
6+
export { webdriverio, playwright }
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { Browser, LaunchOptions } from 'playwright'
2+
3+
declare module 'vitest/node' {
4+
interface BrowserProviderOptions {
5+
launch?: LaunchOptions
6+
page?: Parameters<Browser['newPage']>[0]
7+
}
8+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { RemoteOptions } from 'webdriverio'
2+
3+
declare module 'vitest/node' {
4+
interface BrowserProviderOptions extends RemoteOptions {}
5+
}

packages/browser/rollup.config.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import pkg from './package.json' assert { type: 'json' }
88
const external = [
99
...Object.keys(pkg.dependencies),
1010
...Object.keys(pkg.peerDependencies || {}),
11+
'vitest/node',
12+
'vitest',
1113
'worker_threads',
1214
'node:worker_threads',
1315
]
@@ -23,11 +25,14 @@ const plugins = [
2325
}),
2426
]
2527

28+
const input = {
29+
index: './src/node/index.ts',
30+
providers: './src/node/providers/index.ts',
31+
}
32+
2633
export default () => [
2734
{
28-
input: [
29-
'./src/node/index.ts',
30-
],
35+
input,
3136
output: {
3237
dir: 'dist',
3338
format: 'esm',
@@ -36,7 +41,7 @@ export default () => [
3641
plugins,
3742
},
3843
{
39-
input: './src/node/index.ts',
44+
input: input.index,
4045
output: {
4146
file: 'dist/index.d.ts',
4247
format: 'esm',

packages/browser/src/client/main.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ async function defaultErrorReport(type: string, unhandledError: any) {
7070
message: unhandledError.message,
7171
stack: unhandledError.stack,
7272
}
73+
if (testId !== 'no-isolate')
74+
error.VITEST_TEST_PATH = testId
7375
await client.rpc.onUnhandledError(error, type)
7476
await client.rpc.onDone(testId)
7577
}
@@ -81,7 +83,10 @@ let runningTests = false
8183

8284
async function reportUnexpectedError(rpc: typeof client.rpc, type: string, error: any) {
8385
const { processError } = await importId('vitest/browser') as typeof import('vitest/browser')
84-
await rpc.onUnhandledError(processError(error), type)
86+
const processedError = processError(error)
87+
if (testId !== 'no-isolate')
88+
error.VITEST_TEST_PATH = testId
89+
await rpc.onUnhandledError(processedError, type)
8590
if (!runningTests)
8691
await rpc.onDone(testId)
8792
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { PlaywrightBrowserProvider } from './playwright'
2+
import { WebdriverBrowserProvider } from './webdriver'
3+
4+
export const webdriverio = WebdriverBrowserProvider
5+
export const playwright = PlaywrightBrowserProvider

0 commit comments

Comments
 (0)