Skip to content

Commit 9cc3668

Browse files
authoredDec 15, 2023
fix(types): defineWorkspace fix intellisense and report type errors (#4743)
1 parent 486a3e6 commit 9cc3668

File tree

3 files changed

+77
-8
lines changed

3 files changed

+77
-8
lines changed
 

‎packages/vitest/src/config.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export function defineProject<T extends UserProjectConfigExport>(config: T): T {
3030
return config
3131
}
3232

33-
export function defineWorkspace<T extends (string | (UserProjectConfigExport & { extends?: string }))[]>(config: T): T {
33+
type Workspace = (string | (UserProjectConfigExport & { extends?: string }))
34+
35+
export function defineWorkspace(config: Workspace[]): Workspace[] {
3436
return config
3537
}

‎test/config/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"type": "module",
44
"private": true,
55
"scripts": {
6-
"test": "vitest run --typecheck"
6+
"test": "vitest run --typecheck.enabled"
77
},
88
"devDependencies": {
99
"vite": "latest",

‎test/config/test/config-types.test-d.ts

+73-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { describe, expectTypeOf, test } from 'vitest'
2-
import { type UserWorkspaceConfig, defineConfig, defineProject, defineWorkspace, mergeConfig } from 'vitest/config'
1+
import { assertType, describe, expectTypeOf, test } from 'vitest'
2+
import { defineConfig, defineProject, defineWorkspace, mergeConfig } from 'vitest/config'
33

44
const expectMainTestConfig = expectTypeOf(defineConfig).parameter(0).resolves.toHaveProperty('test').exclude<undefined>()
55
const expectProjectTestConfig = expectTypeOf(defineProject).parameter(0).resolves.toHaveProperty('test').exclude<undefined>()
@@ -26,9 +26,76 @@ describe('merge config helper', () => {
2626
})
2727
})
2828

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()
29+
describe('define workspace helper', () => {
30+
type DefineWorkspaceParameter = Parameters<typeof defineWorkspace>[0]
31+
32+
test('allows string', () => {
33+
assertType<DefineWorkspaceParameter>(['./path/to/workspace'])
34+
})
35+
36+
test('allows config object', () => {
37+
assertType<DefineWorkspaceParameter>([{
38+
test: {
39+
name: 'Workspace Project #1',
40+
include: ['string'],
41+
42+
// @ts-expect-error -- Not allowed here
43+
coverage: {},
44+
},
45+
}])
46+
})
47+
48+
test('allows mixing strings and config objects', () => {
49+
assertType<DefineWorkspaceParameter>([
50+
'./path/to/project',
51+
{
52+
test: {
53+
name: 'Workspace Project #1',
54+
include: ['string'],
55+
56+
// @ts-expect-error -- Not allowed here
57+
coverage: {},
58+
},
59+
},
60+
'./path/to/another/project',
61+
{
62+
extends: 'workspace custom field',
63+
test: {
64+
name: 'Workspace Project #2',
65+
include: ['string'],
66+
67+
// @ts-expect-error -- Not allowed here
68+
coverage: {},
69+
},
70+
},
71+
])
72+
})
73+
74+
test('return type matches parameters', () => {
75+
expectTypeOf(defineWorkspace).returns.toMatchTypeOf<DefineWorkspaceParameter>()
76+
77+
expectTypeOf(defineWorkspace([
78+
'./path/to/project',
79+
{
80+
test: {
81+
name: 'Workspace Project #1',
82+
include: ['string'],
83+
84+
// @ts-expect-error -- Not allowed here
85+
coverage: {},
86+
},
87+
},
88+
'./path/to/another/project',
89+
{
90+
extends: 'workspace custom field',
91+
test: {
92+
name: 'Workspace Project #2',
93+
include: ['string'],
94+
95+
// @ts-expect-error -- Not allowed here
96+
coverage: {},
97+
},
98+
},
99+
])).items.toMatchTypeOf<DefineWorkspaceParameter[number]>()
33100
})
34101
})

0 commit comments

Comments
 (0)
Please sign in to comment.