From c77c545da379c62fbb94d3415c714325105e8637 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 18 Feb 2024 21:26:21 +0800 Subject: [PATCH 01/15] feat!(config): deprecate `cache.dir` option --- packages/vitest/src/node/cache/index.ts | 10 ++++------ packages/vitest/src/node/cache/results.ts | 7 +++---- packages/vitest/src/node/config.ts | 11 +++++++---- packages/vitest/src/node/core.ts | 2 +- packages/vitest/src/node/plugins/optimizer.ts | 4 ++-- packages/vitest/src/node/plugins/utils.ts | 8 +++----- packages/vitest/src/types/config.ts | 9 +++++---- 7 files changed, 25 insertions(+), 26 deletions(-) diff --git a/packages/vitest/src/node/cache/index.ts b/packages/vitest/src/node/cache/index.ts index 6783736ba23a..44cbdf94c817 100644 --- a/packages/vitest/src/node/cache/index.ts +++ b/packages/vitest/src/node/cache/index.ts @@ -5,7 +5,6 @@ import { resolve } from 'pathe' import { loadConfigFromFile } from 'vite' import { configFiles } from '../../constants' import type { CliOptions } from '../cli/cli-api' -import { slash } from '../../utils' import { FilesStatsCache } from './files' import { ResultsCache } from './results' @@ -21,11 +20,10 @@ export class VitestCache { return this.stats.getStats(key) } - static resolveCacheDir(root: string, dir: string | undefined, projectName: string | undefined) { - const baseDir = slash(dir || 'node_modules/.vitest') + static resolveCacheDir(dir: string, projectName: string | undefined) { return projectName - ? resolve(root, baseDir, crypto.createHash('md5').update(projectName, 'utf-8').digest('hex')) - : resolve(root, baseDir) + ? resolve(dir, crypto.createHash('md5').update(projectName, 'utf-8').digest('hex')) + : dir } static async clearCache(options: CliOptions) { @@ -47,7 +45,7 @@ export class VitestCache { if (cache === false) throw new Error('Cache is disabled') - const cachePath = VitestCache.resolveCacheDir(root, cache?.dir, projectName) + const cachePath = VitestCache.resolveCacheDir(config!.cacheDir!, projectName) let cleared = false diff --git a/packages/vitest/src/node/cache/results.ts b/packages/vitest/src/node/cache/results.ts index 9f570a37ad26..4662e45c50db 100644 --- a/packages/vitest/src/node/cache/results.ts +++ b/packages/vitest/src/node/cache/results.ts @@ -1,6 +1,6 @@ import fs from 'node:fs' import { dirname, relative, resolve } from 'pathe' -import type { File, ResolvedConfig } from '../../types' +import type { File } from '../../types' import { version } from '../../../package.json' export interface SuiteResultCache { @@ -19,10 +19,9 @@ export class ResultsCache { return this.cachePath } - setConfig(root: string, config: ResolvedConfig['cache']) { + setConfig(root: string, cacheDir: string) { this.root = root - if (config) - this.cachePath = resolve(config.dir, 'results.json') + this.cachePath = resolve(cacheDir, 'results.json') } getResults(key: string) { diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index e1e46d16c6af..b342786cd5b3 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -7,7 +7,6 @@ import { defaultBrowserPort, defaultPort, extraInlineDeps } from '../constants' import { benchmarkConfigDefaults, configDefaults } from '../defaults' import { isCI, stdProvider, toArray } from '../utils' import type { BuiltinPool } from '../types/pool-options' -import { VitestCache } from './cache' import { BaseSequencer } from './sequencers/BaseSequencer' import { RandomSequencer } from './sequencers/RandomSequencer' import type { BenchmarkBuiltinReporters } from './reporters' @@ -436,9 +435,13 @@ export function resolveConfig( resolved.css.modules.classNameStrategy ??= 'stable' } - resolved.cache ??= { dir: '' } - if (resolved.cache) - resolved.cache.dir = VitestCache.resolveCacheDir(resolved.root, resolved.cache.dir, resolved.name) + if (resolved.cache && resolved.cache.dir) { + console.warn( + c.yellow( + `${c.inverse(c.yellow(' Vitest '))} "cache.dir" is deprecated. Use vite's "cacheDir" instead.`, + ), + ) + } resolved.sequence ??= {} as any if (!resolved.sequence?.sequencer) { diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index 8bd9f601bb7e..e0b595ccf68d 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -151,7 +151,7 @@ export class Vitest { ? await createBenchmarkReporters(toArray(resolved.benchmark?.reporters), this.runner) : await createReporters(resolved.reporters, this) - this.cache.results.setConfig(resolved.root, resolved.cache) + this.cache.results.setConfig(resolved.root, server.config.cacheDir) try { await this.cache.results.readFromCache() } diff --git a/packages/vitest/src/node/plugins/optimizer.ts b/packages/vitest/src/node/plugins/optimizer.ts index c276ef6e696c..21b1288263fe 100644 --- a/packages/vitest/src/node/plugins/optimizer.ts +++ b/packages/vitest/src/node/plugins/optimizer.ts @@ -8,8 +8,8 @@ export function VitestOptimizer(): Plugin { order: 'post', handler(viteConfig) { const testConfig = viteConfig.test || {} - const webOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.web, viteConfig.optimizeDeps, testConfig) - const ssrOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.ssr, viteConfig.ssr?.optimizeDeps, testConfig) + const webOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.web, viteConfig.optimizeDeps, viteConfig) + const ssrOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.ssr, viteConfig.ssr?.optimizeDeps, viteConfig) viteConfig.cacheDir = webOptimizer.cacheDir || ssrOptimizer.cacheDir || viteConfig.cacheDir viteConfig.optimizeDeps = webOptimizer.optimizeDeps diff --git a/packages/vitest/src/node/plugins/utils.ts b/packages/vitest/src/node/plugins/utils.ts index cb4495c890e8..0c3cbb312794 100644 --- a/packages/vitest/src/node/plugins/utils.ts +++ b/packages/vitest/src/node/plugins/utils.ts @@ -1,11 +1,11 @@ import { searchForWorkspaceRoot, version as viteVersion } from 'vite' import type { DepOptimizationOptions, ResolvedConfig, UserConfig as ViteConfig } from 'vite' import { dirname } from 'pathe' -import type { DepsOptimizationOptions, InlineConfig } from '../../types' +import type { DepsOptimizationOptions } from '../../types' import { VitestCache } from '../cache' import { rootDir } from '../../paths' -export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, testConfig: InlineConfig) { +export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, viteConfig: ViteConfig) { const testOptions = _testOptions || {} const newConfig: { cacheDir?: string; optimizeDeps: DepOptimizationOptions } = {} as any const [major, minor, fix] = viteVersion.split('.').map(Number) @@ -24,8 +24,6 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u } } else { - const root = testConfig.root ?? process.cwd() - const cacheDir = testConfig.cache !== false ? testConfig.cache?.dir : undefined const currentInclude = (testOptions.include || viteOptions?.include || []) const exclude = [ 'vitest', @@ -39,7 +37,7 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u const include = (testOptions.include || viteOptions?.include || []).filter((n: string) => !exclude.includes(n)) - newConfig.cacheDir = cacheDir ?? VitestCache.resolveCacheDir(root, cacheDir, testConfig.name) + newConfig.cacheDir = viteConfig.test?.cache ? VitestCache.resolveCacheDir(viteConfig.cacheDir!, viteConfig.test?.name) : undefined newConfig.optimizeDeps = { ...viteOptions, ...testOptions, diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index ec674dfb3f7a..d36101eaf8b5 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -606,11 +606,9 @@ export interface InlineConfig { /** * Options for configuring cache policy. - * @default { dir: 'node_modules/.vitest' } + * @default { dir: 'node_modules/.vite' } */ - cache?: false | { - dir?: string - } + cache?: false /** * Options for configuring the order of running tests. @@ -816,6 +814,9 @@ export interface ResolvedConfig extends Omit, 'config' | 'f } cache: { + /** + * @deprecated + */ dir: string } | false From bd44d67eb061c39078327cc4cc38b3f2a3ec3c87 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 18 Feb 2024 21:36:43 +0800 Subject: [PATCH 02/15] docs: update --- docs/config/index.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index 18ebf912a88a..959b36c175ce 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -1732,18 +1732,10 @@ Test above this limit will be queued to run when available slot appears. ### cache -- **Type**: `false | { dir? }` +- **Type**: `false` - **CLI**: `--no-cache`, `--cache=false` -Options to configure Vitest cache policy. At the moment Vitest stores cache for test results to run the longer and failed tests first. - -#### cache.dir - -- **Type**: `string` -- **Default**: `node_modules/.vitest` -- **CLI**: `--cache.dir=./cache` - -Path to cache directory. +Use this option if you want to disable the cache feature. At the moment Vitest stores cache file in Vite's [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir) for test results to run the longer and failed tests first. ### sequence From b42c2272155298b3b382b0ee21acb117a38b2e52 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 18 Feb 2024 21:56:13 +0800 Subject: [PATCH 03/15] types: revert `cache` --- packages/vitest/src/types/config.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index d36101eaf8b5..8851ff3f7c0b 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -608,7 +608,12 @@ export interface InlineConfig { * Options for configuring cache policy. * @default { dir: 'node_modules/.vite' } */ - cache?: false + cache?: false | { + /** + * @deprecated Use Vite's `cacheDir` instead. + */ + dir: string + } /** * Options for configuring the order of running tests. From 91f5d50ed5a48be3ecd5870760b87be413a37286 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 18 Feb 2024 22:12:48 +0800 Subject: [PATCH 04/15] test: update --- test/cache/vitest-custom.config.ts | 7 ++----- test/cache/vitest.config.ts | 4 +--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/test/cache/vitest-custom.config.ts b/test/cache/vitest-custom.config.ts index 6087616010f8..9f0aae0b9af5 100644 --- a/test/cache/vitest-custom.config.ts +++ b/test/cache/vitest-custom.config.ts @@ -1,9 +1,6 @@ import { defineConfig } from 'vite' export default defineConfig({ - test: { - cache: { - dir: 'cache/.vitest-custom', - }, - }, + cacheDir: 'cache/.vitest-custom', + test: {}, }) diff --git a/test/cache/vitest.config.ts b/test/cache/vitest.config.ts index 6461c042ead9..2b13708df301 100644 --- a/test/cache/vitest.config.ts +++ b/test/cache/vitest.config.ts @@ -1,10 +1,8 @@ import { defineConfig } from 'vite' export default defineConfig({ + cacheDir: 'cache/.vitest-base', test: { pool: 'forks', - cache: { - dir: 'cache/.vitest-base', - }, }, }) From f156b7e11b9b83ce4f74540885702213e8bf1475 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 18 Feb 2024 22:40:12 +0800 Subject: [PATCH 05/15] chore: update cli config --- packages/vitest/src/node/cli/cli-config.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/vitest/src/node/cli/cli-config.ts b/packages/vitest/src/node/cli/cli-config.ts index aeefab1f4d6c..61dd0754499f 100644 --- a/packages/vitest/src/node/cli/cli-config.ts +++ b/packages/vitest/src/node/cli/cli-config.ts @@ -538,20 +538,13 @@ export const cliOptionsConfig: VitestCLIOptions = { cache: { description: 'Enable cache', argument: '', // allow only boolean - subcommands: { - dir: { - description: 'Path to the cache directory', - argument: '', - normalize: true, - }, - }, // cache can only be "false" or an object transform(cache) { if (cache) return {} return cache }, - }, + } as VitestCLIOptions['cache'], maxConcurrency: { description: 'Maximum number of concurrent tests in a suite (default: 5)', argument: '', From e3341fb6f5638159838e18f2f8d8bc7b3d70f860 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 18 Feb 2024 22:43:42 +0800 Subject: [PATCH 06/15] test: update --- test/core/test/cli-test.test.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/test/core/test/cli-test.test.ts b/test/core/test/cli-test.test.ts index 4bc5b3b7a69a..15f6a35534a9 100644 --- a/test/core/test/cli-test.test.ts +++ b/test/core/test/cli-test.test.ts @@ -212,13 +212,7 @@ test('cache is parsed correctly', () => { expect(getCLIOptions('--cache')).toEqual({ cache: {} }) expect(getCLIOptions('--no-cache')).toEqual({ cache: false }) - expect(getCLIOptions('--cache.dir=./test/cache.json')).toEqual({ - cache: { dir: 'test/cache.json' }, - }) - expect(getCLIOptions('--cache.dir ./test/cache.json')).toEqual({ - cache: { dir: 'test/cache.json' }, - }) - expect(getCLIOptions('--cache.dir .\\test\\cache.json')).toEqual({ + expect(getCLIOptions('--cache.dir=./test/cache.json')).not.toEqual({ cache: { dir: 'test/cache.json' }, }) }) From 11456b83fb2841613201303d854ba4f04d8cb313 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Mon, 19 Feb 2024 15:54:14 +0800 Subject: [PATCH 07/15] chore: keep subcommands --- packages/vitest/src/node/cli/cli-config.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/vitest/src/node/cli/cli-config.ts b/packages/vitest/src/node/cli/cli-config.ts index 61dd0754499f..41364c273e6e 100644 --- a/packages/vitest/src/node/cli/cli-config.ts +++ b/packages/vitest/src/node/cli/cli-config.ts @@ -538,13 +538,16 @@ export const cliOptionsConfig: VitestCLIOptions = { cache: { description: 'Enable cache', argument: '', // allow only boolean + subcommands: { + dir: null, + }, // cache can only be "false" or an object transform(cache) { if (cache) return {} return cache }, - } as VitestCLIOptions['cache'], + }, maxConcurrency: { description: 'Maximum number of concurrent tests in a suite (default: 5)', argument: '', From 30e122b4e637d7c5df161d3f24c9bd8a5016d38c Mon Sep 17 00:00:00 2001 From: Han Feng Date: Mon, 19 Feb 2024 16:23:08 +0800 Subject: [PATCH 08/15] chore: handle `cache.dir` --- packages/vitest/src/node/plugins/utils.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/vitest/src/node/plugins/utils.ts b/packages/vitest/src/node/plugins/utils.ts index 0c3cbb312794..a6257da17408 100644 --- a/packages/vitest/src/node/plugins/utils.ts +++ b/packages/vitest/src/node/plugins/utils.ts @@ -24,6 +24,8 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u } } else { + const testConfig = viteConfig.test || {} + const cacheDir = testConfig.cache !== false ? testConfig.cache?.dir : undefined const currentInclude = (testOptions.include || viteOptions?.include || []) const exclude = [ 'vitest', @@ -37,7 +39,7 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u const include = (testOptions.include || viteOptions?.include || []).filter((n: string) => !exclude.includes(n)) - newConfig.cacheDir = viteConfig.test?.cache ? VitestCache.resolveCacheDir(viteConfig.cacheDir!, viteConfig.test?.name) : undefined + newConfig.cacheDir = cacheDir ?? VitestCache.resolveCacheDir(viteConfig.cacheDir!, testConfig.name) newConfig.optimizeDeps = { ...viteOptions, ...testOptions, From 82c5c2a949dc94f7f4e98116484fd327b35ff018 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Wed, 21 Feb 2024 22:08:07 +0800 Subject: [PATCH 09/15] chore: update --- packages/vitest/src/node/cache/results.ts | 7 ++++--- packages/vitest/src/node/config.ts | 15 ++++++++++----- packages/vitest/src/node/core.ts | 2 +- packages/vitest/src/node/plugins/optimizer.ts | 4 ++-- packages/vitest/src/node/plugins/utils.ts | 9 +++------ 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/packages/vitest/src/node/cache/results.ts b/packages/vitest/src/node/cache/results.ts index 4662e45c50db..9f570a37ad26 100644 --- a/packages/vitest/src/node/cache/results.ts +++ b/packages/vitest/src/node/cache/results.ts @@ -1,6 +1,6 @@ import fs from 'node:fs' import { dirname, relative, resolve } from 'pathe' -import type { File } from '../../types' +import type { File, ResolvedConfig } from '../../types' import { version } from '../../../package.json' export interface SuiteResultCache { @@ -19,9 +19,10 @@ export class ResultsCache { return this.cachePath } - setConfig(root: string, cacheDir: string) { + setConfig(root: string, config: ResolvedConfig['cache']) { this.root = root - this.cachePath = resolve(cacheDir, 'results.json') + if (config) + this.cachePath = resolve(config.dir, 'results.json') } getResults(key: string) { diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index b342786cd5b3..173a05b36c46 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -11,6 +11,7 @@ import { BaseSequencer } from './sequencers/BaseSequencer' import { RandomSequencer } from './sequencers/RandomSequencer' import type { BenchmarkBuiltinReporters } from './reporters' import { builtinPools } from './pool' +import { VitestCache } from './cache' function resolvePath(path: string, root: string) { return normalize( @@ -435,12 +436,16 @@ export function resolveConfig( resolved.css.modules.classNameStrategy ??= 'stable' } - if (resolved.cache && resolved.cache.dir) { - console.warn( - c.yellow( + if (resolved.cache !== false) { + if (resolved.cache && resolved.cache.dir) { + console.warn( + c.yellow( `${c.inverse(c.yellow(' Vitest '))} "cache.dir" is deprecated. Use vite's "cacheDir" instead.`, - ), - ) + ), + ) + } + + resolved.cache = { dir: VitestCache.resolveCacheDir(viteConfig.cacheDir, resolved.name) } } resolved.sequence ??= {} as any diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index e0b595ccf68d..8bd9f601bb7e 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -151,7 +151,7 @@ export class Vitest { ? await createBenchmarkReporters(toArray(resolved.benchmark?.reporters), this.runner) : await createReporters(resolved.reporters, this) - this.cache.results.setConfig(resolved.root, server.config.cacheDir) + this.cache.results.setConfig(resolved.root, resolved.cache) try { await this.cache.results.readFromCache() } diff --git a/packages/vitest/src/node/plugins/optimizer.ts b/packages/vitest/src/node/plugins/optimizer.ts index 21b1288263fe..c276ef6e696c 100644 --- a/packages/vitest/src/node/plugins/optimizer.ts +++ b/packages/vitest/src/node/plugins/optimizer.ts @@ -8,8 +8,8 @@ export function VitestOptimizer(): Plugin { order: 'post', handler(viteConfig) { const testConfig = viteConfig.test || {} - const webOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.web, viteConfig.optimizeDeps, viteConfig) - const ssrOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.ssr, viteConfig.ssr?.optimizeDeps, viteConfig) + const webOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.web, viteConfig.optimizeDeps, testConfig) + const ssrOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.ssr, viteConfig.ssr?.optimizeDeps, testConfig) viteConfig.cacheDir = webOptimizer.cacheDir || ssrOptimizer.cacheDir || viteConfig.cacheDir viteConfig.optimizeDeps = webOptimizer.optimizeDeps diff --git a/packages/vitest/src/node/plugins/utils.ts b/packages/vitest/src/node/plugins/utils.ts index a6257da17408..644c76f2a6d6 100644 --- a/packages/vitest/src/node/plugins/utils.ts +++ b/packages/vitest/src/node/plugins/utils.ts @@ -1,11 +1,10 @@ import { searchForWorkspaceRoot, version as viteVersion } from 'vite' import type { DepOptimizationOptions, ResolvedConfig, UserConfig as ViteConfig } from 'vite' import { dirname } from 'pathe' -import type { DepsOptimizationOptions } from '../../types' -import { VitestCache } from '../cache' +import type { DepsOptimizationOptions, InlineConfig } from '../../types' import { rootDir } from '../../paths' -export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, viteConfig: ViteConfig) { +export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, testConfig: InlineConfig) { const testOptions = _testOptions || {} const newConfig: { cacheDir?: string; optimizeDeps: DepOptimizationOptions } = {} as any const [major, minor, fix] = viteVersion.split('.').map(Number) @@ -24,8 +23,6 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u } } else { - const testConfig = viteConfig.test || {} - const cacheDir = testConfig.cache !== false ? testConfig.cache?.dir : undefined const currentInclude = (testOptions.include || viteOptions?.include || []) const exclude = [ 'vitest', @@ -39,7 +36,7 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u const include = (testOptions.include || viteOptions?.include || []).filter((n: string) => !exclude.includes(n)) - newConfig.cacheDir = cacheDir ?? VitestCache.resolveCacheDir(viteConfig.cacheDir!, testConfig.name) + newConfig.cacheDir = testConfig.cache !== false ? testConfig.cache?.dir : undefined newConfig.optimizeDeps = { ...viteOptions, ...testOptions, From f831b7a46cfa74324eeb2465d75bbbd44829f239 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Wed, 21 Feb 2024 22:35:01 +0800 Subject: [PATCH 10/15] test: update --- test/optimize-deps/test/ssr.test.ts | 2 +- test/optimize-deps/test/web.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/optimize-deps/test/ssr.test.ts b/test/optimize-deps/test/ssr.test.ts index dc59d558b84b..94467616d8bd 100644 --- a/test/optimize-deps/test/ssr.test.ts +++ b/test/optimize-deps/test/ssr.test.ts @@ -8,5 +8,5 @@ import { importMetaUrl } from '@vitest/test-dep-url' // TODO: flaky on Windows // https://github.com/vitest-dev/vitest/pull/5215#discussion_r1492066033 test.skipIf(process.platform === 'win32')('import.meta.url', () => { - expect(importMetaUrl).toContain('/node_modules/.vitest/deps_ssr/') + expect(importMetaUrl).toContain('/node_modules/.vite/deps_ssr/') }) diff --git a/test/optimize-deps/test/web.test.ts b/test/optimize-deps/test/web.test.ts index 308e7730640f..ee81b227873f 100644 --- a/test/optimize-deps/test/web.test.ts +++ b/test/optimize-deps/test/web.test.ts @@ -6,5 +6,5 @@ import { expect, test } from 'vitest' import { importMetaUrl } from '@vitest/test-dep-url' test('import.meta.url', () => { - expect(importMetaUrl).toContain('/node_modules/.vitest/deps/') + expect(importMetaUrl).toContain('/node_modules/.vite/deps/') }) From 4a39b08b89be84b86dde7e22008644cc08d452bb Mon Sep 17 00:00:00 2001 From: Han Feng Date: Fri, 1 Mar 2024 17:28:28 +0800 Subject: [PATCH 11/15] chore: update --- packages/vitest/src/node/cache/index.ts | 10 ++++++---- packages/vitest/src/node/config.ts | 8 ++++++-- packages/vitest/src/node/plugins/utils.ts | 5 ++++- packages/vitest/src/types/config.ts | 4 ++-- test/cache/vitest-custom.config.ts | 7 +++++-- test/cache/vitest.config.ts | 4 +++- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/vitest/src/node/cache/index.ts b/packages/vitest/src/node/cache/index.ts index 44cbdf94c817..209722e78862 100644 --- a/packages/vitest/src/node/cache/index.ts +++ b/packages/vitest/src/node/cache/index.ts @@ -5,6 +5,7 @@ import { resolve } from 'pathe' import { loadConfigFromFile } from 'vite' import { configFiles } from '../../constants' import type { CliOptions } from '../cli/cli-api' +import { slash } from '../../utils' import { FilesStatsCache } from './files' import { ResultsCache } from './results' @@ -20,10 +21,11 @@ export class VitestCache { return this.stats.getStats(key) } - static resolveCacheDir(dir: string, projectName: string | undefined) { + static resolveCacheDir(root: string, dir?: string, projectName?: string) { + const baseDir = slash(dir || 'node_modules/.vite/vitest') return projectName - ? resolve(dir, crypto.createHash('md5').update(projectName, 'utf-8').digest('hex')) - : dir + ? resolve(root, baseDir, crypto.createHash('md5').update(projectName, 'utf-8').digest('hex')) + : resolve(root, baseDir) } static async clearCache(options: CliOptions) { @@ -45,7 +47,7 @@ export class VitestCache { if (cache === false) throw new Error('Cache is disabled') - const cachePath = VitestCache.resolveCacheDir(config!.cacheDir!, projectName) + const cachePath = VitestCache.resolveCacheDir(root, cache?.dir, projectName) let cleared = false diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index 173a05b36c46..c890cf5fb31f 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -437,15 +437,19 @@ export function resolveConfig( } if (resolved.cache !== false) { + let cacheDir = VitestCache.resolveCacheDir('', resolve(viteConfig.cacheDir, 'vitest'), resolved.name) + if (resolved.cache && resolved.cache.dir) { console.warn( c.yellow( - `${c.inverse(c.yellow(' Vitest '))} "cache.dir" is deprecated. Use vite's "cacheDir" instead.`, + `${c.inverse(c.yellow(' Vitest '))} "cache.dir" is deprecated, use Vite's "cacheDir" instead if you want to change the cache director. Note caches will be written to "cacheDir\/vitest"`, ), ) + + cacheDir = VitestCache.resolveCacheDir(resolved.root, resolved.cache.dir, resolved.name) } - resolved.cache = { dir: VitestCache.resolveCacheDir(viteConfig.cacheDir, resolved.name) } + resolved.cache = { dir: cacheDir } } resolved.sequence ??= {} as any diff --git a/packages/vitest/src/node/plugins/utils.ts b/packages/vitest/src/node/plugins/utils.ts index 644c76f2a6d6..7ad47b812425 100644 --- a/packages/vitest/src/node/plugins/utils.ts +++ b/packages/vitest/src/node/plugins/utils.ts @@ -3,6 +3,7 @@ import type { DepOptimizationOptions, ResolvedConfig, UserConfig as ViteConfig } import { dirname } from 'pathe' import type { DepsOptimizationOptions, InlineConfig } from '../../types' import { rootDir } from '../../paths' +import { VitestCache } from '../cache' export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, testConfig: InlineConfig) { const testOptions = _testOptions || {} @@ -23,6 +24,8 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u } } else { + const root = testConfig.root ?? process.cwd() + const cacheDir = testConfig.cache !== false ? testConfig.cache?.dir : undefined const currentInclude = (testOptions.include || viteOptions?.include || []) const exclude = [ 'vitest', @@ -36,7 +39,7 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u const include = (testOptions.include || viteOptions?.include || []).filter((n: string) => !exclude.includes(n)) - newConfig.cacheDir = testConfig.cache !== false ? testConfig.cache?.dir : undefined + newConfig.cacheDir = cacheDir ?? VitestCache.resolveCacheDir(root, cacheDir, testConfig.name) newConfig.optimizeDeps = { ...viteOptions, ...testOptions, diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index 0468d58e700a..a7eb11c7e9e0 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -612,11 +612,11 @@ export interface InlineConfig { /** * Options for configuring cache policy. - * @default { dir: 'node_modules/.vite' } + * @default 'node_modules/.vite/vitest' */ cache?: false | { /** - * @deprecated Use Vite's `cacheDir` instead. + * @deprecated Use Vite's "cacheDir" instead if you want to change the cache director. Note caches will be written to "cacheDir\/vitest". */ dir: string } diff --git a/test/cache/vitest-custom.config.ts b/test/cache/vitest-custom.config.ts index 9f0aae0b9af5..6087616010f8 100644 --- a/test/cache/vitest-custom.config.ts +++ b/test/cache/vitest-custom.config.ts @@ -1,6 +1,9 @@ import { defineConfig } from 'vite' export default defineConfig({ - cacheDir: 'cache/.vitest-custom', - test: {}, + test: { + cache: { + dir: 'cache/.vitest-custom', + }, + }, }) diff --git a/test/cache/vitest.config.ts b/test/cache/vitest.config.ts index 2b13708df301..6461c042ead9 100644 --- a/test/cache/vitest.config.ts +++ b/test/cache/vitest.config.ts @@ -1,8 +1,10 @@ import { defineConfig } from 'vite' export default defineConfig({ - cacheDir: 'cache/.vitest-base', test: { pool: 'forks', + cache: { + dir: 'cache/.vitest-base', + }, }, }) From a7cd849745515fe5cd41ade89e8e8d2239ce83be Mon Sep 17 00:00:00 2001 From: Han Feng Date: Fri, 1 Mar 2024 17:29:02 +0800 Subject: [PATCH 12/15] test: add tests --- test/config/fixtures/cache/basic.test.ts | 5 + test/config/test/cache.test.ts | 123 +++++++++++++++++++++++ test/core/test/cli-test.test.ts | 4 - test/optimize-deps/test/ssr.test.ts | 2 +- test/optimize-deps/test/web.test.ts | 2 +- 5 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 test/config/fixtures/cache/basic.test.ts create mode 100644 test/config/test/cache.test.ts diff --git a/test/config/fixtures/cache/basic.test.ts b/test/config/fixtures/cache/basic.test.ts new file mode 100644 index 000000000000..36c7cc207dde --- /dev/null +++ b/test/config/fixtures/cache/basic.test.ts @@ -0,0 +1,5 @@ +import { expect, test } from "vitest"; + +test('', () => { + expect(true).toBe(true) +}) diff --git a/test/config/test/cache.test.ts b/test/config/test/cache.test.ts new file mode 100644 index 000000000000..379ddbc93d38 --- /dev/null +++ b/test/config/test/cache.test.ts @@ -0,0 +1,123 @@ +import { describe, expect, test } from 'vitest' +import { resolve } from 'pathe' +import { runVitest } from '../../test-utils' + +const root = resolve(__dirname, '../fixtures/cache') +const project = resolve(__dirname, '../') + +test('default', async () => { + const { vitest, stdout, stderr } = await runVitest({ + root, + include: ['*.test.ts'], + }) + + expect(stdout).toContain('✓ basic.test.ts >') + expect(stderr).toBe('') + + const cachePath = vitest!.cache.results.getCachePath() + const path = resolve(project, 'node_modules/.vite/vitest/results.json') + expect(cachePath).toMatch(path) +}) + +test('use cache.dir', async () => { + const { vitest, stdout, stderr } = await runVitest( + { + root, + include: ['*.test.ts'], + cache: { + dir: 'node_modules/.vitest-custom', + }, + }, + ) + + expect(stdout).toContain('✓ basic.test.ts >') + expect(stderr).toContain('"cache.dir" is deprecated') + + const cachePath = vitest!.cache.results.getCachePath() + const path = resolve(root, 'node_modules/.vitest-custom/results.json') + expect(cachePath).toMatch(path) +}) + +test('use cacheDir', async () => { + const { vitest, stdout, stderr } = await runVitest( + { + root, + include: ['*.test.ts'], + }, + [], + 'test', + { cacheDir: 'node_modules/.vite-custom' }, + ) + + expect(stdout).toContain('✓ basic.test.ts >') + expect(stderr).toBe('') + + const cachePath = vitest!.cache.results.getCachePath() + const path = resolve(root, 'node_modules/.vite-custom/vitest/results.json') + expect(cachePath).toMatch(path) +}) + +describe('with optimizer enabled', () => { + const deps = { + optimizer: { + web: { + enabled: true, + }, + }, + } + + test('default', async () => { + const { vitest, stdout, stderr } = await runVitest({ + root, + include: ['*.test.ts'], + deps, + }) + + expect(stdout).toContain('✓ basic.test.ts >') + expect(stderr).toBe('') + + const cachePath = vitest!.cache.results.getCachePath() + const path = resolve(project, 'node_modules/.vite/vitest/results.json') + expect(cachePath).toBe(path) + }) + + test('use cache.dir', async () => { + const { vitest, stdout, stderr } = await runVitest( + { + root, + include: ['*.test.ts'], + deps, + cache: { + dir: 'node_modules/.vitest-custom', + }, + }, + ) + + expect(stdout).toContain('✓ basic.test.ts >') + expect(stderr).toContain('"cache.dir" is deprecated') + + const cachePath = vitest!.cache.results.getCachePath() + const path = resolve(root, 'node_modules/.vitest-custom/results.json') + expect(cachePath).toBe(path) + }) + + test('use cacheDir', async () => { + const { vitest, stdout, stderr } = await runVitest( + { + root, + include: ['*.test.ts'], + deps, + }, + [], + 'test', + { cacheDir: 'node_modules/.vite-custom' }, + ) + + expect(stdout).toContain('✓ basic.test.ts >') + expect(stderr).toBe('') + + const cachePath = vitest!.cache.results.getCachePath() + const path = resolve(root, 'node_modules/.vite-custom/vitest/results.json') + expect(cachePath).toBe(path) + }) +}) diff --git a/test/core/test/cli-test.test.ts b/test/core/test/cli-test.test.ts index 29c9af2effad..9a6d39f8989b 100644 --- a/test/core/test/cli-test.test.ts +++ b/test/core/test/cli-test.test.ts @@ -211,10 +211,6 @@ test('maxConcurrency is parsed correctly', () => { test('cache is parsed correctly', () => { expect(getCLIOptions('--cache')).toEqual({ cache: {} }) expect(getCLIOptions('--no-cache')).toEqual({ cache: false }) - - expect(getCLIOptions('--cache.dir=./test/cache.json')).not.toEqual({ - cache: { dir: 'test/cache.json' }, - }) }) test('typecheck correctly passes down arguments', () => { diff --git a/test/optimize-deps/test/ssr.test.ts b/test/optimize-deps/test/ssr.test.ts index 94467616d8bd..38d519ecad22 100644 --- a/test/optimize-deps/test/ssr.test.ts +++ b/test/optimize-deps/test/ssr.test.ts @@ -8,5 +8,5 @@ import { importMetaUrl } from '@vitest/test-dep-url' // TODO: flaky on Windows // https://github.com/vitest-dev/vitest/pull/5215#discussion_r1492066033 test.skipIf(process.platform === 'win32')('import.meta.url', () => { - expect(importMetaUrl).toContain('/node_modules/.vite/deps_ssr/') + expect(importMetaUrl).toContain('/node_modules/.vite/vitest/deps_ssr/') }) diff --git a/test/optimize-deps/test/web.test.ts b/test/optimize-deps/test/web.test.ts index ee81b227873f..88af98f6f4af 100644 --- a/test/optimize-deps/test/web.test.ts +++ b/test/optimize-deps/test/web.test.ts @@ -6,5 +6,5 @@ import { expect, test } from 'vitest' import { importMetaUrl } from '@vitest/test-dep-url' test('import.meta.url', () => { - expect(importMetaUrl).toContain('/node_modules/.vite/deps/') + expect(importMetaUrl).toContain('/node_modules/.vite/vitest/deps/') }) From 1aff021711c914ec34f2a41d27d7b1d638563e6d Mon Sep 17 00:00:00 2001 From: Han Feng Date: Fri, 1 Mar 2024 17:41:24 +0800 Subject: [PATCH 13/15] chore: update --- packages/vitest/src/node/config.ts | 2 +- packages/vitest/src/node/plugins/utils.ts | 2 +- packages/vitest/src/types/config.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index c890cf5fb31f..e9f8987c08a8 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -7,11 +7,11 @@ import { defaultBrowserPort, defaultPort, extraInlineDeps } from '../constants' import { benchmarkConfigDefaults, configDefaults } from '../defaults' import { isCI, stdProvider, toArray } from '../utils' import type { BuiltinPool } from '../types/pool-options' +import { VitestCache } from './cache' import { BaseSequencer } from './sequencers/BaseSequencer' import { RandomSequencer } from './sequencers/RandomSequencer' import type { BenchmarkBuiltinReporters } from './reporters' import { builtinPools } from './pool' -import { VitestCache } from './cache' function resolvePath(path: string, root: string) { return normalize( diff --git a/packages/vitest/src/node/plugins/utils.ts b/packages/vitest/src/node/plugins/utils.ts index 7ad47b812425..cb4495c890e8 100644 --- a/packages/vitest/src/node/plugins/utils.ts +++ b/packages/vitest/src/node/plugins/utils.ts @@ -2,8 +2,8 @@ import { searchForWorkspaceRoot, version as viteVersion } from 'vite' import type { DepOptimizationOptions, ResolvedConfig, UserConfig as ViteConfig } from 'vite' import { dirname } from 'pathe' import type { DepsOptimizationOptions, InlineConfig } from '../../types' -import { rootDir } from '../../paths' import { VitestCache } from '../cache' +import { rootDir } from '../../paths' export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, testConfig: InlineConfig) { const testOptions = _testOptions || {} diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index a7eb11c7e9e0..30c7981ae0f8 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -612,7 +612,7 @@ export interface InlineConfig { /** * Options for configuring cache policy. - * @default 'node_modules/.vite/vitest' + * @default { dir: 'node_modules/.vite/vitest' } */ cache?: false | { /** From 147e6b94e6d331d16247698828507ba59fa6d82c Mon Sep 17 00:00:00 2001 From: Han Feng Date: Fri, 1 Mar 2024 17:41:37 +0800 Subject: [PATCH 14/15] docs: update --- docs/config/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/config/index.md b/docs/config/index.md index 62effdcee6f9..e9ebabc9a068 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -1735,7 +1735,7 @@ Test above this limit will be queued to run when available slot appears. - **Type**: `false` - **CLI**: `--no-cache`, `--cache=false` -Use this option if you want to disable the cache feature. At the moment Vitest stores cache file in Vite's [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir) for test results to run the longer and failed tests first. +Use this option if you want to disable the cache feature. At the moment Vitest stores cache for test results to run the longer and failed tests first. ### sequence From 8af373b7c8a066362b91de37736f00cfd89abfd6 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Fri, 15 Mar 2024 15:54:31 +0800 Subject: [PATCH 15/15] chore: intercept the `--cache.dir` command option --- packages/vitest/src/node/cli/cli-config.ts | 3 +++ test/core/test/cli-test.test.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/packages/vitest/src/node/cli/cli-config.ts b/packages/vitest/src/node/cli/cli-config.ts index 75ae83eecbbe..b5e16b9f526c 100644 --- a/packages/vitest/src/node/cli/cli-config.ts +++ b/packages/vitest/src/node/cli/cli-config.ts @@ -551,8 +551,11 @@ export const cliOptionsConfig: VitestCLIOptions = { subcommands: { dir: null, }, + default: true, // cache can only be "false" or an object transform(cache) { + if (typeof cache !== 'boolean' && cache) + throw new Error('--cache.dir is deprecated') if (cache) return {} return cache diff --git a/test/core/test/cli-test.test.ts b/test/core/test/cli-test.test.ts index 9b602548ff32..1d4a3ce636cf 100644 --- a/test/core/test/cli-test.test.ts +++ b/test/core/test/cli-test.test.ts @@ -213,6 +213,7 @@ test('maxConcurrency is parsed correctly', () => { test('cache is parsed correctly', () => { expect(getCLIOptions('--cache')).toEqual({ cache: {} }) expect(getCLIOptions('--no-cache')).toEqual({ cache: false }) + expect(() => getCLIOptions('--cache.dir=./cache')).toThrowError('--cache.dir is deprecated') }) test('shuffle is parsed correctly', () => {