Skip to content

Commit 9cc3668

Browse files
authored
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

Lines changed: 3 additions & 1 deletion
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

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 --typecheck"
6+
"test": "vitest run --typecheck.enabled"
77
},
88
"devDependencies": {
99
"vite": "latest",

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

Lines changed: 73 additions & 6 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy