Back to skills
SkillHub ClubShip Full StackFull Stack

migrating-to-vitest-4

Imported from https://github.com/djankies/claude-configs.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
0
Hot score
74
Updated
March 20, 2026
Overall rating
C2.5
Composite score
2.5
Best-practice grade
S96.0

Install command

npx @skill-hub/cli install djankies-claude-configs-migrating-to-vitest-4

Repository

djankies/claude-configs

Skill path: vitest-4/skills/migrating-to-vitest-4

Imported from https://github.com/djankies/claude-configs.

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: djankies.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install migrating-to-vitest-4 into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/djankies/claude-configs before adding migrating-to-vitest-4 to shared team environments
  • Use migrating-to-vitest-4 for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: migrating-to-vitest-4
description: Migrate from Vitest 2.x/3.x to 4.x with pool options, coverage config, workspace to projects, and browser mode updates. Use when upgrading Vitest versions or encountering deprecated patterns.
allowed-tools: [Read, Write, Edit, Bash, Grep, Glob]
---

# Migrating to Vitest 4

This skill guides migration from Vitest 2.x/3.x to 4.x, focusing on breaking changes and deprecated patterns.

## Migration Overview

Vitest 4.0 introduces breaking changes in:

1. **Pool Architecture**: Consolidated worker configuration
2. **Coverage**: Required explicit include patterns
3. **Workspace**: Replaced by projects array
4. **Browser Mode**: Separate provider packages
5. **Dependencies**: Moved to server namespace
6. **Module Runner**: New Vite-based implementation

## Quick Migration Guide

### Pool Configuration

**Before (Vitest 3.x):**
```typescript
export default defineConfig({
  test: {
    maxThreads: 4,
    singleThread: true,
  },
});
```

**After (Vitest 4.x):**
```typescript
export default defineConfig({
  test: {
    maxWorkers: 4,
    maxWorkers: 1,
    isolate: false,
  },
});
```

### Coverage Configuration

**Before (Vitest 3.x):**
```typescript
coverage: {
  provider: 'v8',
  all: true,
}
```

**After (Vitest 4.x):**
```typescript
coverage: {
  provider: 'v8',
  include: ['src/**/*.{ts,tsx}'],
}
```

### Workspace to Projects

**Before (Vitest 3.x):**
```typescript
import { defineWorkspace } from 'vitest/config';

export default defineWorkspace([
  { test: { name: 'unit' } },
]);
```

**After (Vitest 4.x):**
```typescript
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    projects: [
      { test: { name: 'unit' } },
    ],
  },
});
```

### Browser Mode

**Before (Vitest 3.x):**
```typescript
browser: {
  enabled: true,
  name: 'chromium',
  provider: 'playwright',
}
```

**After (Vitest 4.x):**
```typescript
import { playwright } from '@vitest/browser-playwright';

browser: {
  enabled: true,
  provider: playwright(),
  instances: [{ browser: 'chromium' }],
}
```

**Import updates:**
```typescript
import { page } from 'vitest/browser';
```

### Dependencies

**Before (Vitest 3.x):**
```typescript
deps: {
  inline: ['vue'],
}
```

**After (Vitest 4.x):**
```typescript
server: {
  deps: {
    inline: ['vue'],
  },
}
```

For detailed migration tables covering all options, see [references/migration-tables.md](./references/migration-tables.md)

## Migration Workflow

### Step 1: Update Package

```bash
npm install -D vitest@latest
```

### Step 2: Update Config

1. Replace `maxThreads`/`maxForks` with `maxWorkers`
2. Add `coverage.include` patterns
3. Replace `defineWorkspace` with `projects`
4. Move `deps.*` to `server.deps.*`
5. Update browser provider imports

### Step 3: Update Test Files

```bash
grep -r "@vitest/browser/context" . --include="*.ts"
```

Replace with:
```typescript
import { page, userEvent } from 'vitest/browser';
```

### Step 4: Install Browser Providers

If using browser mode:

```bash
npm install -D @vitest/browser-playwright
```

### Step 5: Run Tests

```bash
vitest --run
```

Check for deprecation warnings.

### Step 6: Verify Coverage

```bash
vitest --coverage
```

For complete migration workflow with troubleshooting, see [references/migration-workflow.md](./references/migration-workflow.md)

## Migration Checklist

### Configuration
- [ ] Update `vitest` to 4.x
- [ ] Replace `maxThreads`/`maxForks` with `maxWorkers`
- [ ] Add explicit `coverage.include` patterns
- [ ] Replace `defineWorkspace` with `projects`
- [ ] Move `deps.*` to `server.deps.*`
- [ ] Update browser provider config

### Test Files
- [ ] Update imports from `@vitest/browser/context` to `vitest/browser`
- [ ] Remove `vitest/execute` imports

### Environment
- [ ] Replace `VITE_NODE_DEPS_MODULE_DIRECTORIES` with `VITEST_MODULE_DIRECTORIES`

### Verification
- [ ] Run tests and verify no deprecation warnings
- [ ] Verify coverage reports generate correctly

## Common Migration Issues

### Issue: "maxThreads is not a valid option"

**Solution:** Replace with `maxWorkers`

### Issue: Coverage Reports Empty

**Solution:** Add explicit `coverage.include` patterns

### Issue: Workspace Config Not Working

**Solution:** Replace `defineWorkspace` with `defineConfig` and `projects`

### Issue: Browser Tests Fail

**Solution:** Install provider package and update imports

### Issue: "deps.inline is not a valid option"

**Solution:** Move to `server.deps.inline`

For detailed troubleshooting, see [references/migration-workflow.md](./references/migration-workflow.md)

## Mock Implementation Changes

### Mock Names
Returns `vi.fn()` instead of `spy` in Vitest 4.x

### Invocation Order
Starts at `1` instead of `0` (matching Jest)

### Restore Mocks
No longer affects automocks

## Reporter Changes

**Before (Vitest 3.x):**
```typescript
reporters: ['basic']
```

**After (Vitest 4.x):**
```typescript
reporters: ['default'],
summary: false
```

## Environment Variables

**Before:**
```bash
VITE_NODE_DEPS_MODULE_DIRECTORIES=/path vitest
```

**After:**
```bash
VITEST_MODULE_DIRECTORIES=/path vitest
```

## Default Exclusions

**Vitest 3.x:** Excluded many directories by default

**Vitest 4.x:** Only excludes `node_modules` and `.git`

Add explicit excludes if needed:

```typescript
coverage: {
  include: ['src/**/*.ts'],
  exclude: [
    '**/node_modules/**',
    '**/dist/**',
    '**/*.test.ts',
  ],
}
```

## References

For detailed migration information:
- [Migration Tables](./references/migration-tables.md) - Complete before/after comparisons
- [Migration Workflow](./references/migration-workflow.md) - Step-by-step process with troubleshooting

For new configuration patterns, see `@vitest-4/skills/configuring-vitest-4`

For browser mode setup, see `@vitest-4/skills/using-browser-mode`

For complete API reference, see `@vitest-4/knowledge/vitest-4-comprehensive.md`
migrating-to-vitest-4 | SkillHub