Skip to content

Commit 7dee832

Browse files
authored
fix(vitest): use correct type for defineProject to allow usage in mergeConfig (#4498)
1 parent ac3d300 commit 7dee832

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

packages/vitest/src/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ export function defineConfig(config: UserConfigExport): UserConfigExport {
2626
return config
2727
}
2828

29-
export function defineProject(config: UserProjectConfigExport) {
29+
export function defineProject<T extends UserProjectConfigExport>(config: T): T {
3030
return config
3131
}
3232

33-
export function defineWorkspace(config: (string | (UserProjectConfigExport & { extends?: string }))[]) {
33+
export function defineWorkspace<T extends (string | (UserProjectConfigExport & { extends?: string }))[]>(config: T): T {
3434
return config
3535
}

test/config/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"type": "module",
44
"private": true,
55
"scripts": {
6-
"test": "vitest run"
6+
"test": "vitest run --typecheck"
77
},
88
"devDependencies": {
99
"vite": "latest",
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { describe, expectTypeOf, test } from 'vitest'
2+
import { type UserWorkspaceConfig, defineConfig, defineProject, defineWorkspace, mergeConfig } from 'vitest/config'
3+
4+
const expectMainTestConfig = expectTypeOf(defineConfig).parameter(0).resolves.toHaveProperty('test').exclude<undefined>()
5+
const expectProjectTestConfig = expectTypeOf(defineProject).parameter(0).resolves.toHaveProperty('test').exclude<undefined>()
6+
7+
describe('define project helper', () => {
8+
test('cannot define non-project fields on a project config', () => {
9+
expectProjectTestConfig.toHaveProperty('name')
10+
expectMainTestConfig.toHaveProperty('name')
11+
12+
expectProjectTestConfig.not.toHaveProperty('pool')
13+
expectMainTestConfig.toHaveProperty('pool')
14+
15+
expectProjectTestConfig.not.toHaveProperty('coverage')
16+
expectMainTestConfig.toHaveProperty('coverage')
17+
})
18+
})
19+
20+
describe('merge config helper', () => {
21+
test('types are not conflicting', () => {
22+
expectTypeOf(mergeConfig(
23+
defineConfig({}),
24+
defineProject({ test: { name: 'test' } }),
25+
)).toMatchTypeOf<Record<string, unknown>>()
26+
})
27+
})
28+
29+
describe('workspace config', () => {
30+
test('correctly defines return type', () => {
31+
expectTypeOf(defineWorkspace([{ test: { name: 'test' } }])).items.toMatchTypeOf<UserWorkspaceConfig>()
32+
expectTypeOf(defineWorkspace(['packages/*'])).items.toBeString()
33+
})
34+
})

test/config/tsconfig.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"extends": "../../tsconfig.base.json",
3+
"exclude": [
4+
"**/dist/**"
5+
]
6+
}

0 commit comments

Comments
 (0)