From 28efb560a1109b86dce81fe8feced3ed26ac42c3 Mon Sep 17 00:00:00 2001 From: AriPerkkio Date: Wed, 13 Dec 2023 20:59:13 +0200 Subject: [PATCH] fix(config): `defineWorkspace` fix intellisense and report type errors --- packages/vitest/src/config.ts | 4 +- test/config/package.json | 2 +- test/config/test/config-types.test-d.ts | 79 +++++++++++++++++++++++-- 3 files changed, 77 insertions(+), 8 deletions(-) diff --git a/packages/vitest/src/config.ts b/packages/vitest/src/config.ts index e08dcab0fa05..b3e71144ff7a 100644 --- a/packages/vitest/src/config.ts +++ b/packages/vitest/src/config.ts @@ -30,6 +30,8 @@ export function defineProject(config: T): T { return config } -export function defineWorkspace(config: T): T { +type Workspace = (string | (UserProjectConfigExport & { extends?: string })) + +export function defineWorkspace(config: Workspace[]): Workspace[] { return config } diff --git a/test/config/package.json b/test/config/package.json index 3318db3a6246..598c81fc3ec0 100644 --- a/test/config/package.json +++ b/test/config/package.json @@ -3,7 +3,7 @@ "type": "module", "private": true, "scripts": { - "test": "vitest run --typecheck" + "test": "vitest run --typecheck.enabled" }, "devDependencies": { "vite": "latest", diff --git a/test/config/test/config-types.test-d.ts b/test/config/test/config-types.test-d.ts index ce7dbc8288d8..2e3258cfff57 100644 --- a/test/config/test/config-types.test-d.ts +++ b/test/config/test/config-types.test-d.ts @@ -1,5 +1,5 @@ -import { describe, expectTypeOf, test } from 'vitest' -import { type UserWorkspaceConfig, defineConfig, defineProject, defineWorkspace, mergeConfig } from 'vitest/config' +import { assertType, describe, expectTypeOf, test } from 'vitest' +import { 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() @@ -26,9 +26,76 @@ describe('merge config helper', () => { }) }) -describe('workspace config', () => { - test('correctly defines return type', () => { - expectTypeOf(defineWorkspace([{ test: { name: 'test' } }])).items.toMatchTypeOf() - expectTypeOf(defineWorkspace(['packages/*'])).items.toBeString() +describe('define workspace helper', () => { + type DefineWorkspaceParameter = Parameters[0] + + test('allows string', () => { + assertType(['./path/to/workspace']) + }) + + test('allows config object', () => { + assertType([{ + test: { + name: 'Workspace Project #1', + include: ['string'], + + // @ts-expect-error -- Not allowed here + coverage: {}, + }, + }]) + }) + + test('allows mixing strings and config objects', () => { + assertType([ + './path/to/project', + { + test: { + name: 'Workspace Project #1', + include: ['string'], + + // @ts-expect-error -- Not allowed here + coverage: {}, + }, + }, + './path/to/another/project', + { + extends: 'workspace custom field', + test: { + name: 'Workspace Project #2', + include: ['string'], + + // @ts-expect-error -- Not allowed here + coverage: {}, + }, + }, + ]) + }) + + test('return type matches parameters', () => { + expectTypeOf(defineWorkspace).returns.toMatchTypeOf() + + expectTypeOf(defineWorkspace([ + './path/to/project', + { + test: { + name: 'Workspace Project #1', + include: ['string'], + + // @ts-expect-error -- Not allowed here + coverage: {}, + }, + }, + './path/to/another/project', + { + extends: 'workspace custom field', + test: { + name: 'Workspace Project #2', + include: ['string'], + + // @ts-expect-error -- Not allowed here + coverage: {}, + }, + }, + ])).items.toMatchTypeOf() }) })