Workspace
O Vitest oferece suporte nativo a monorepositórios através de um arquivo de configuração de workspace. Você pode criar um workspace para definir as configurações dos seus projetos.
Definindo um Workspace
Um workspace deve ter um arquivo vitest.workspace
ou vitest.projects
em sua raiz (na mesma pasta do seu arquivo de configuração principal, se você tiver um). O Vitest suporta as extensões ts
/js
/json
para este arquivo.
O arquivo de configuração do workspace deve exportar por padrão uma lista de arquivos ou padrões globais (glob patterns) que referenciam seus projetos. Por exemplo, se você tiver uma pasta chamada packages
contendo seus projetos, você pode definir um workspace com o seguinte arquivo de configuração:
export default ['packages/*'];
O Vitest considerará cada pasta dentro de packages
como um projeto separado, mesmo que não possua um arquivo de configuração individual.
WARNING
O Vitest não considerará a configuração raiz como um projeto do workspace (portanto, não executará os testes especificados em include
), a menos que ela seja explicitamente incluída nesta configuração do workspace.
Você também pode referenciar projetos através dos seus arquivos de configuração:
export default ['packages/*/vitest.config.{e2e,unit}.ts'];
Este padrão incluirá apenas projetos que possuam um arquivo vitest.config
cujo nome contenha e2e
ou unit
antes da extensão.
WARNING
Se você estiver referenciando arquivos usando padrões glob, certifique-se de que o nome do seu arquivo de configuração comece com vite.config
ou vitest.config
. Caso contrário, o Vitest o ignorará.
Você também pode definir projetos com configurações inline. O arquivo de workspace suporta o uso de ambas as sintaxes simultaneamente.
import { defineWorkspace } from 'vitest/config';
// defineWorkspace oferece uma boa experiência de desenvolvimento (DX) com dicas de tipo
export default defineWorkspace([
'packages/*',
{
// adicione "extends" para mesclar duas configurações
extends: './vite.config.js',
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// recomenda-se definir um nome ao usar configurações inline
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
name: 'node',
environment: 'node',
},
},
]);
WARNING
Todos os projetos devem ter nomes distintos. Caso contrário, o Vitest retornará um erro. Se você não fornecer um nome dentro de uma configuração inline, o Vitest atribuirá um número automaticamente. Se você não fornecer um nome dentro de uma configuração de projeto definida com a sintaxe glob, o Vitest usará o nome do diretório como padrão.
Se você não precisa de configurações inline, você pode simplesmente criar um pequeno arquivo JSON no seu diretório raiz:
["packages/*"]
Projetos de workspace não suportam todas as propriedades de configuração. Para uma melhor segurança de tipos, use o método defineProject
em vez do método defineConfig
dentro dos arquivos de configuração do projeto:
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" não é suportado em configurações de projeto,
// então mostrará um erro
reporters: ['json'],
},
});
Configuração
Nenhuma das opções de configuração é herdada do arquivo de configuração de nível raiz. Você pode criar um arquivo de configuração compartilhado e mesclá-lo com a configuração do projeto individualmente:
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);
Além disso, algumas opções de configuração não são permitidas em configurações de projeto. As principais são:
coverage
: a cobertura é feita para todo o workspacereporters
: apenas os reporters definidos no nível raiz são suportadosresolveSnapshotPath
: apenas o resolver definido no nível raiz é considerado- todas as outras opções que não afetam os executores de teste
TIP
Todas as opções de configuração que não são suportadas dentro de uma configuração de projeto têm o sinal * ao lado delas na página "Config".
Cobertura de Código
A cobertura de código para projetos de workspace funciona sem configuração adicional. No entanto, se você tiver a opção all
habilitada e usar extensões de arquivo não convencionais em alguns dos seus projetos, você precisará de um plugin que suporte essas extensões no seu arquivo de configuração raiz.
Por exemplo, se você tiver um pacote que usa arquivos Vue e ele tem seu próprio arquivo de configuração, mas se alguns desses arquivos não forem importados nos seus testes, a cobertura de código falhará ao tentar analisar o uso de arquivos não utilizados, pois depende da configuração raiz e não da configuração do projeto individual.