Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,14 @@
"types": "./dist/test/browser-playwright.d.ts",
"default": "./dist/test/browser-playwright.js"
},
"./test/browser-webdriverio": {
"types": "./dist/test/browser-webdriverio.d.ts",
"default": "./dist/test/browser-webdriverio.js"
},
"./test/browser-preview": {
"types": "./dist/test/browser-preview.d.ts",
"default": "./dist/test/browser-preview.js"
},
"./test/plugins/runner": {
"default": "./dist/test/plugins/runner.js"
},
Expand Down Expand Up @@ -264,8 +272,11 @@
"./test/plugins/browser-playwright": {
"default": "./dist/test/plugins/browser-playwright.js"
},
"./test/plugins/browser-playwright-context": {
"default": "./dist/test/plugins/browser-playwright-context.js"
"./test/plugins/browser-webdriverio": {
"default": "./dist/test/plugins/browser-webdriverio.js"
},
"./test/plugins/browser-preview": {
"default": "./dist/test/plugins/browser-preview.js"
}
}
}
132 changes: 91 additions & 41 deletions packages/test/BUNDLING.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,21 @@ This approach avoids the critical issue of Rolldown creating shared chunks that

### Copied Packages (`dist/@vitest/`)

These 9 `@vitest/*` packages are **copied** (not bundled) to preserve their original file structure:

| Package | Purpose |
| ---------------------------- | ---------------------------------------------------- |
| `@vitest/runner` | Test runner core |
| `@vitest/utils` | Utilities (source-map, error, display, timers, etc.) |
| `@vitest/spy` | Spy/mock implementation |
| `@vitest/expect` | Assertion library |
| `@vitest/snapshot` | Snapshot testing |
| `@vitest/mocker` | Module mocking (node, browser, automock) |
| `@vitest/pretty-format` | Output formatting |
| `@vitest/browser` | Browser testing support |
| `@vitest/browser-playwright` | Playwright integration |
These 11 `@vitest/*` packages are **copied** (not bundled) to preserve their original file structure:

| Package | Purpose |
| ----------------------------- | ---------------------------------------------------- |
| `@vitest/runner` | Test runner core |
| `@vitest/utils` | Utilities (source-map, error, display, timers, etc.) |
| `@vitest/spy` | Spy/mock implementation |
| `@vitest/expect` | Assertion library |
| `@vitest/snapshot` | Snapshot testing |
| `@vitest/mocker` | Module mocking (node, browser, automock) |
| `@vitest/pretty-format` | Output formatting |
| `@vitest/browser` | Browser testing support |
| `@vitest/browser-playwright` | Playwright integration |
| `@vitest/browser-webdriverio` | WebdriverIO integration |
| `@vitest/browser-preview` | Preview (testing-library) integration |

**Why copy instead of bundle?** Bundling would create shared chunks that mix browser-safe and Node.js-only code. Copying preserves the original separation.

Expand Down Expand Up @@ -73,6 +75,7 @@ These packages are explicitly kept external in `EXTERNAL_BLOCKLIST` during the R
| Package | Reason |
| ------------------ | ----------------------------------------- |
| `playwright` | Native bindings, user must install |
| `webdriverio` | Native bindings, user must install |
| `debug` | Environment detection breaks when bundled |
| `happy-dom` | Optional peer dependency |
| `jsdom` | Optional peer dependency |
Expand Down Expand Up @@ -102,13 +105,21 @@ For maintainers developing the vitest/vite migration feature, here are the trans

### Import Rewrites

| Original Import | Rewritten Import |
| ----------------------------------- | -------------------------------------------------------- |
| `from "@vitest/browser-playwright"` | `from "@voidzero-dev/vite-plus-test/browser-playwright"` |
| `from "vite"` | `from "@voidzero-dev/vite-plus-core"` |
| `from "vite/module-runner"` | `from "@voidzero-dev/vite-plus-core/module-runner"` |
| Original Import | Rewritten Import |
| ------------------------------------ | --------------------------------------------------------- |
| `from "@vitest/browser-playwright"` | `from "@voidzero-dev/vite-plus-test/browser-playwright"` |
| `from "@vitest/browser-webdriverio"` | `from "@voidzero-dev/vite-plus-test/browser-webdriverio"` |
| `from "@vitest/browser-preview"` | `from "@voidzero-dev/vite-plus-test/browser-preview"` |
| `from "vite"` | `from "@voidzero-dev/vite-plus-core"` |
| `from "vite/module-runner"` | `from "@voidzero-dev/vite-plus-core/module-runner"` |

**Note:** pnpm overrides don't affect Node.js module resolution at config load time, so config files must use the `@voidzero-dev/vite-plus-test/browser-playwright` import path.
**Note:** When using pnpm overrides, you have three options for browser provider imports:

- `vitest/browser-playwright` (or `vitest/browser-webdriverio`, `vitest/browser-preview`) - works when `vitest` is overridden to our package (Recommended)
- `@voidzero-dev/vite-plus-test/browser-playwright` - direct import from test package
- `@voidzero-dev/vite-plus/test/plugins/browser-playwright` - direct import from CLI package
Comment thread
Brooooooklyn marked this conversation as resolved.

Importing from `@vitest/browser-*` packages directly requires additional overrides for those specific packages.

### package.json Changes

Expand All @@ -118,7 +129,9 @@ For maintainers developing the vitest/vite migration feature, here are the trans
{
"devDependencies": {
"@vitest/browser": "...", // Remove
"@vitest/browser-playwright": "...", // Remove
"@vitest/browser-playwright": "...", // Remove (if using playwright)
"@vitest/browser-webdriverio": "...", // Remove (if using webdriverio)
"@vitest/browser-preview": "...", // Remove (if using testing-library)
"@vitest/ui": "..." // Remove (peer dep, not bundled but optional)
}
}
Expand All @@ -133,6 +146,8 @@ overrides:
vitest: 'file:path/to/vite-plus-test.tgz'
'@vitest/browser': 'file:path/to/vite-plus-test.tgz'
'@vitest/browser-playwright': 'file:path/to/vite-plus-test.tgz'
'@vitest/browser-webdriverio': 'file:path/to/vite-plus-test.tgz'
'@vitest/browser-preview': 'file:path/to/vite-plus-test.tgz'
```

Or using npm package names:
Expand All @@ -143,33 +158,55 @@ overrides:
vitest: 'npm:@voidzero-dev/vite-plus-test'
'@vitest/browser': 'npm:@voidzero-dev/vite-plus-test'
'@vitest/browser-playwright': 'npm:@voidzero-dev/vite-plus-test'
'@vitest/browser-webdriverio': 'npm:@voidzero-dev/vite-plus-test'
'@vitest/browser-preview': 'npm:@voidzero-dev/vite-plus-test'
```

### Config File Updates

```typescript
// Before
// Before (playwright)
import { playwright } from '@vitest/browser-playwright';

// After
// After - Option 1 (Recommended): Via vitest subpath (works when vitest is overridden)
import { playwright } from 'vitest/browser-playwright';

// After - Option 2: Direct import from test package
import { playwright } from '@voidzero-dev/vite-plus-test/browser-playwright';

// After - Option 3: Direct import from CLI package
import { playwright } from '@voidzero-dev/vite-plus/test/plugins/browser-playwright';
Comment thread
Brooooooklyn marked this conversation as resolved.
```

Similarly for WebdriverIO:

```typescript
import { webdriverio } from 'vitest/browser-webdriverio';
```

And for Preview (testing-library):

```typescript
import { preview } from 'vitest/browser-preview';
```

### Plugin Exports for pnpm Overrides

The package provides `./plugins/*` exports to enable pnpm overrides for all `@vitest/*` packages:

```
@vitest/runner -> @voidzero-dev/vite-plus-test/plugins/runner
@vitest/utils -> @voidzero-dev/vite-plus-test/plugins/utils
@vitest/utils/error -> @voidzero-dev/vite-plus-test/plugins/utils-error
@vitest/spy -> @voidzero-dev/vite-plus-test/plugins/spy
@vitest/expect -> @voidzero-dev/vite-plus-test/plugins/expect
@vitest/snapshot -> @voidzero-dev/vite-plus-test/plugins/snapshot
@vitest/mocker -> @voidzero-dev/vite-plus-test/plugins/mocker
@vitest/pretty-format -> @voidzero-dev/vite-plus-test/plugins/pretty-format
@vitest/browser -> @voidzero-dev/vite-plus-test/plugins/browser
@vitest/browser-playwright -> @voidzero-dev/vite-plus-test/plugins/browser-playwright
@vitest/runner -> @voidzero-dev/vite-plus-test/plugins/runner
@vitest/utils -> @voidzero-dev/vite-plus-test/plugins/utils
@vitest/utils/error -> @voidzero-dev/vite-plus-test/plugins/utils-error
@vitest/spy -> @voidzero-dev/vite-plus-test/plugins/spy
@vitest/expect -> @voidzero-dev/vite-plus-test/plugins/expect
@vitest/snapshot -> @voidzero-dev/vite-plus-test/plugins/snapshot
@vitest/mocker -> @voidzero-dev/vite-plus-test/plugins/mocker
@vitest/pretty-format -> @voidzero-dev/vite-plus-test/plugins/pretty-format
@vitest/browser -> @voidzero-dev/vite-plus-test/plugins/browser
@vitest/browser-playwright -> @voidzero-dev/vite-plus-test/plugins/browser-playwright
@vitest/browser-webdriverio -> @voidzero-dev/vite-plus-test/plugins/browser-webdriverio
@vitest/browser-preview -> @voidzero-dev/vite-plus-test/plugins/browser-preview
```

---
Expand Down Expand Up @@ -247,21 +284,22 @@ When upgrading the vitest version:
### Build Flow

```
1. bundleVitest() Copy vitest-dev dist/ -> dist/
2. copyVitestPackages() Copy @vitest/* -> dist/@vitest/
3. convertTabsToSpaces() Normalize formatting for patches
4. collectLeafDependencies() Parse imports with oxc-parser
5. bundleLeafDeps() Bundle chai, pathe, etc -> dist/vendor/
6. rewriteVitestImports() Rewrite @vitest/*, vitest/*, vite
7. patchVitestPkgRootPaths() Fix distRoot for relocated files
1. bundleVitest() Copy vitest-dev dist/ -> dist/
2. copyVitestPackages() Copy @vitest/* -> dist/@vitest/
3. convertTabsToSpaces() Normalize formatting for patches
4. collectLeafDependencies() Parse imports with oxc-parser
5. bundleLeafDeps() Bundle chai, pathe, etc -> dist/vendor/
6. rewriteVitestImports() Rewrite @vitest/*, vitest/*, vite
7. patchVitestPkgRootPaths() Fix distRoot for relocated files
8. patchVitestBrowserPackage() Inject vendor-aliases plugin
9. patchPlaywrightLocators() Fix browser-safe imports
9. patchBrowserProviderLocators() Fix browser-safe imports
10. Post-processing:
- patchVendorPaths()
- createBrowserCompatShim()
- createModuleRunnerStub() Browser-safe stub
- createNodeEntry() index-node.js with browser-provider
- copyBrowserClientFiles()
- createBrowserEntryFiles() browser/ entry files at package root
- createPluginExports() dist/plugins/* for pnpm overrides
- mergePackageJson()
- validateExternalDeps()
Expand All @@ -270,6 +308,9 @@ When upgrading the vitest version:
### Output Structure

```
browser/ # Entry files for ./browser export
├── context.js # Runtime guard (throws if not in browser)
└── context.d.ts # Re-exports from dist/@vitest/browser/context.d.ts
dist/
├── @vitest/ # Copied packages (browser/Node.js safe)
│ ├── runner/
Expand Down Expand Up @@ -315,7 +356,13 @@ This is achieved through:
1. Conditional exports in package.json (`"node": "./dist/index-node.js"`)
2. Browser-safe stubs for `module-runner`
3. Import rewriting to prevent Node.js code from being pulled into browser bundles
4. `vendor-aliases` plugin injection to resolve imports at runtime
4. `vendor-aliases` plugin injection to resolve imports at runtime:
- Handles `@vitest/*` imports → resolves to copied `dist/@vitest/` files
- Handles `vitest/*` subpaths → resolves to dist files (enables `vitest/browser-playwright` usage)
- Handles `vitest/browser-playwright`, `vitest/browser-webdriverio`, `vitest/browser-preview` → resolves to bundled browser providers
- Handles `@voidzero-dev/vite-plus-test/*` subpaths → maps to equivalent vitest paths
- Handles `@voidzero-dev/vite-plus/test/*` subpaths → maps to equivalent vitest paths (CLI package)
- Intercepts `vitest/browser`, `@voidzero-dev/vite-plus-test/browser`, `@voidzero-dev/vite-plus/test/browser` → returns virtual module ID for BrowserContext plugin

### Key Constants

Expand All @@ -331,6 +378,8 @@ const VITEST_PACKAGES_TO_COPY = [
'@vitest/pretty-format',
'@vitest/browser',
'@vitest/browser-playwright',
'@vitest/browser-webdriverio',
'@vitest/browser-preview',
];

// Packages that must NOT be bundled (from build.ts lines 131-158)
Expand All @@ -350,6 +399,7 @@ const EXTERNAL_BLOCKLIST = new Set([
// Optional dependencies with bundling issues or native bindings
'debug', // environment detection broken when bundled
'playwright', // native bindings
'webdriverio', // native bindings

// Runtime deps (in package.json dependencies) - not bundled, resolved at install time
'sirv',
Expand Down
Loading
Loading