diff --git a/packages/vitest/src/node/reporters/base.ts b/packages/vitest/src/node/reporters/base.ts index 51f3477f5001..dc0147da89d6 100644 --- a/packages/vitest/src/node/reporters/base.ts +++ b/packages/vitest/src/node/reporters/base.ts @@ -4,7 +4,7 @@ import type { ErrorWithDiff, File, Reporter, Task, TaskResultPack, UserConsoleLo import { clearInterval, getFullName, getSuites, getTests, getTypecheckTests, hasFailed, hasFailedSnapshot, isNode, relativePath, setInterval } from '../../utils' import type { Vitest } from '../../node' import { F_RIGHT } from '../../utils/figures' -import { divider, formatTimeString, getStateString, getStateSymbol, pointer, renderSnapshotSummary } from './renderers/utils' +import { divider, formatProjectName, formatTimeString, getStateString, getStateSymbol, pointer, renderSnapshotSummary } from './renderers/utils' const BADGE_PADDING = ' ' const HELP_HINT = `${c.dim('press ')}${c.bold('h')}${c.dim(' to show help')}` @@ -39,7 +39,6 @@ export abstract class BaseReporter implements Reporter { onInit(ctx: Vitest) { this.ctx = ctx - ctx.logger.printBanner() this.start = performance.now() } @@ -321,11 +320,12 @@ export abstract class BaseReporter implements Reporter { for (const [error, tasks] of errorsQueue) { for (const task of tasks) { const filepath = (task as File)?.filepath || '' + const projectName = (task as File)?.projectName || task.file?.projectName let name = getFullName(task) if (filepath) name = `${name} ${c.dim(`[ ${this.relative(filepath)} ]`)}` - this.ctx.logger.error(`${c.red(c.bold(c.inverse(' FAIL ')))} ${name}`) + this.ctx.logger.error(`${c.red(c.bold(c.inverse(' FAIL ')))} ${formatProjectName(projectName)}${name}`) } await this.ctx.logger.printError(error) errorDivider() diff --git a/packages/vitest/src/node/reporters/renderers/listRenderer.ts b/packages/vitest/src/node/reporters/renderers/listRenderer.ts index d1e94013ea94..316b6d75664a 100644 --- a/packages/vitest/src/node/reporters/renderers/listRenderer.ts +++ b/packages/vitest/src/node/reporters/renderers/listRenderer.ts @@ -5,7 +5,7 @@ import type { Benchmark, BenchmarkResult, SuiteHooks, Task, VitestRunMode } from import { clearInterval, getTests, getTypecheckTests, isTypecheckTest, notNullish, setInterval } from '../../../utils' import { F_RIGHT } from '../../../utils/figures' import type { Logger } from '../../logger' -import { getCols, getHookStateSymbol, getStateSymbol } from './utils' +import { formatProjectName, getCols, getHookStateSymbol, getStateSymbol } from './utils' export interface ListRendererOptions { renderSucceed?: boolean @@ -91,7 +91,10 @@ export function renderTree(tasks: Task[], options: ListRendererOptions, level = for (const task of tasks) { let suffix = '' - const prefix = ` ${getStateSymbol(task)} ` + let prefix = ` ${getStateSymbol(task)} ` + + if (level === 0 && task.type === 'suite' && task.projectName) + prefix += formatProjectName(task.projectName) if (task.type === 'test' && task.result?.retryCount && task.result.retryCount > 1) suffix += c.yellow(` (retry x${task.result.retryCount})`) diff --git a/packages/vitest/src/node/reporters/renderers/utils.ts b/packages/vitest/src/node/reporters/renderers/utils.ts index 39f0cbf9c784..cd7c215efd0e 100644 --- a/packages/vitest/src/node/reporters/renderers/utils.ts +++ b/packages/vitest/src/node/reporters/renderers/utils.ts @@ -195,3 +195,17 @@ export function duration(time: number, locale = 'en-us') { export function formatTimeString(date: Date) { return date.toTimeString().split(' ')[0] } + +export function formatProjectName(name: string | undefined, suffix = ' ') { + if (!name) + return '' + const index = name.split('').reduce((acc, v, idx) => acc + v.charCodeAt(0) + idx, 0) + const colors = [ + c.blue, + c.yellow, + c.cyan, + c.green, + c.magenta, + ] + return colors[index % colors.length](`|${name}|`) + suffix +} diff --git a/packages/vitest/src/runtime/collect.ts b/packages/vitest/src/runtime/collect.ts index 46b7d9fd5dac..1170c898ccd2 100644 --- a/packages/vitest/src/runtime/collect.ts +++ b/packages/vitest/src/runtime/collect.ts @@ -43,6 +43,7 @@ export async function collectTests(paths: string[], config: ResolvedConfig): Pro mode: 'run', filepath, tasks: [], + projectName: config.name, } clearCollectorContext() diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index f109aae62eb4..edbed2d22833 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -31,6 +31,11 @@ export interface EnvironmentOptions { export type VitestRunMode = 'test' | 'benchmark' | 'typecheck' export interface InlineConfig { + /** + * Name of the project. Will be used to display in the reporter. + */ + name?: string + /** * Benchmark options. * diff --git a/packages/vitest/src/types/tasks.ts b/packages/vitest/src/types/tasks.ts index 315e9e22550f..15eba941d8f9 100644 --- a/packages/vitest/src/types/tasks.ts +++ b/packages/vitest/src/types/tasks.ts @@ -37,6 +37,7 @@ export interface Suite extends TaskBase { tasks: Task[] filepath?: string benchmark?: BenchFactory + projectName?: string } export interface File extends Suite { diff --git a/test/core/vitest.config.ts b/test/core/vitest.config.ts index 66c422055641..4a37556787f4 100644 --- a/test/core/vitest.config.ts +++ b/test/core/vitest.config.ts @@ -38,6 +38,7 @@ export default defineConfig({ ], }, test: { + name: 'core', slowTestThreshold: 1000, testTimeout: 2000, setupFiles: [