npm package: @fuf-stack/vitest-config
Description: default vitest config for a Fröhlich ∧ Frei repo
Author: Fröhlich ∧ Frei
Latest version: 4.1.3

## @fuf-stack/vitest-config

Default Vitest configurations for Fröhlich ∧ Frei monorepos. Provides separate configs for workspace-level (root) and project-level (package) setups.

**Compatible with Vitest 4.0+**

### Configs Available

**Workspace Config** (`/workspace`) - For monorepo root:

- Projects array defining workspace structure
- V8 coverage with explicit includes/excludes
- LCOV reporter for CI tools

**Project Config** (`/project`) - For individual packages:

- TypeScript path mapping resolution
- Node environment by default
- Clear mocks between tests

### Install

```bash
# pnpm
pnpm add -D @fuf-stack/vitest-config vitest @vitest/coverage-v8 vite-tsconfig-paths

# npm
npm i -D @fuf-stack/vitest-config vitest @vitest/coverage-v8 vite-tsconfig-paths

# yarn
yarn add -D @fuf-stack/vitest-config vitest @vitest/coverage-v8 vite-tsconfig-paths
```

### Usage

> **Important:** Use `.mts` extension for config files when importing this ESM-only package. Using `.ts` may cause bundler errors as tooling might attempt to use `require()` instead of `import`.

#### Workspace Root Config

Use the workspace config in your monorepo root `vitest.config.mts`:

```ts
// vitest.config.mts (root)
import config from '@fuf-stack/vitest-config/workspace';

export default config;
```

This provides:

- Projects array: `['apps/*', 'packages/*', 'packages/config/*']`
- Coverage configuration with sensible defaults
- LCOV reporter

**Customize if needed:**

```ts
// vitest.config.mts
import { defineConfig, mergeConfig } from 'vitest/config';

import workspaceConfig from '@fuf-stack/vitest-config/workspace';

export default mergeConfig(
  workspaceConfig,
  defineConfig({
    test: {
      projects: ['packages/my-specific-package'],
    },
  }),
);
```

#### Package-Level Configs

Use the project config in individual package `vitest.config.mts`:

```ts
// packages/my-package/vitest.config.mts
import config from '@fuf-stack/vitest-config/project';

export default config;
```

This provides:

- TypeScript path mapping resolution (`vite-tsconfig-paths`)
- Node environment (good for libraries, utilities)
- Clear mocks between tests

**For React components (need jsdom):**

```ts
// packages/ui-components/vitest.config.mts
import { mergeConfig } from 'vitest/config';

import projectConfig from '@fuf-stack/vitest-config/project';

export default mergeConfig(projectConfig, {
  test: {
    environment: 'jsdom',
    setupFiles: ['./vitest.setup.ts'],
  },
});
```

#### Migration from Vitest 3.x

1. **Root config**: Use `/workspace` import
2. **Package configs**: Use `/project` import (or customize with `mergeConfig`)
3. **Rename config files**: Change `.ts` → `.mts` (required for ESM-only packages)
4. Remove `vitest.workspace.ts` file
5. Ensure each package uses `defineProject()` (handled by `/project` config)

### Why `.mts` Extension?

This package is ESM-only (`"type": "module"`). When Vitest bundles config files:

- `.ts` files are ambiguous - bundlers may try `require()` ❌
- `.mts` explicitly declares ES Module - uses `import` ✅

Using `.ts` may result in errors like:

```
Error: Cannot use import statement outside a module
```

The `.mts` extension tells tooling to treat the file as an ES Module, allowing proper imports of ESM-only dependencies.

### Scripts

```json
{
  "scripts": {
    "test": "vitest",
    "test:coverage": "vitest --coverage"
  }
}
```

### License

MIT