From 7dee832d8d3bcfcb6b1507ac8c9490812e5a9a63 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 14 Nov 2023 16:18:08 +0100 Subject: [PATCH] fix(vitest): use correct type for defineProject to allow usage in mergeConfig (#4498) --- packages/vitest/src/config.ts | 4 +-- test/config/package.json | 2 +- test/config/test/config-types.test-d.ts | 34 +++++++++++++++++++++++++ test/config/tsconfig.json | 6 +++++ 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 test/config/test/config-types.test-d.ts create mode 100644 test/config/tsconfig.json diff --git a/packages/vitest/src/config.ts b/packages/vitest/src/config.ts index 1fdd469cd2bf..e08dcab0fa05 100644 --- a/packages/vitest/src/config.ts +++ b/packages/vitest/src/config.ts @@ -26,10 +26,10 @@ export function defineConfig(config: UserConfigExport): UserConfigExport { return config } -export function defineProject(config: UserProjectConfigExport) { +export function defineProject(config: T): T { return config } -export function defineWorkspace(config: (string | (UserProjectConfigExport & { extends?: string }))[]) { +export function defineWorkspace(config: T): T { return config } diff --git a/test/config/package.json b/test/config/package.json index 0fe1448dcdc9..3318db3a6246 100644 --- a/test/config/package.json +++ b/test/config/package.json @@ -3,7 +3,7 @@ "type": "module", "private": true, "scripts": { - "test": "vitest run" + "test": "vitest run --typecheck" }, "devDependencies": { "vite": "latest", diff --git a/test/config/test/config-types.test-d.ts b/test/config/test/config-types.test-d.ts new file mode 100644 index 000000000000..ce7dbc8288d8 --- /dev/null +++ b/test/config/test/config-types.test-d.ts @@ -0,0 +1,34 @@ +import { describe, expectTypeOf, test } from 'vitest' +import { type UserWorkspaceConfig, defineConfig, defineProject, defineWorkspace, mergeConfig } from 'vitest/config' + +const expectMainTestConfig = expectTypeOf(defineConfig).parameter(0).resolves.toHaveProperty('test').exclude() +const expectProjectTestConfig = expectTypeOf(defineProject).parameter(0).resolves.toHaveProperty('test').exclude() + +describe('define project helper', () => { + test('cannot define non-project fields on a project config', () => { + expectProjectTestConfig.toHaveProperty('name') + expectMainTestConfig.toHaveProperty('name') + + expectProjectTestConfig.not.toHaveProperty('pool') + expectMainTestConfig.toHaveProperty('pool') + + expectProjectTestConfig.not.toHaveProperty('coverage') + expectMainTestConfig.toHaveProperty('coverage') + }) +}) + +describe('merge config helper', () => { + test('types are not conflicting', () => { + expectTypeOf(mergeConfig( + defineConfig({}), + defineProject({ test: { name: 'test' } }), + )).toMatchTypeOf>() + }) +}) + +describe('workspace config', () => { + test('correctly defines return type', () => { + expectTypeOf(defineWorkspace([{ test: { name: 'test' } }])).items.toMatchTypeOf() + expectTypeOf(defineWorkspace(['packages/*'])).items.toBeString() + }) +}) diff --git a/test/config/tsconfig.json b/test/config/tsconfig.json new file mode 100644 index 000000000000..824464b4032e --- /dev/null +++ b/test/config/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.base.json", + "exclude": [ + "**/dist/**" + ] +}