From 20865d24e1d66df02fbacc5528a9bc3614cf9958 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 8 Feb 2022 13:55:06 +0300 Subject: [PATCH 1/7] feat: export default config to expand it --- docs/config/index.md | 12 +++++++++ packages/vitest/src/constants.ts | 26 ++++++++++++++++++++ packages/vitest/src/index.ts | 2 ++ packages/vitest/src/integrations/coverage.ts | 26 +++++++++++--------- packages/vitest/src/node/config.ts | 22 +++-------------- packages/vitest/src/types/config.ts | 2 +- 6 files changed, 59 insertions(+), 31 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index 4593b0310676..eddc614322c1 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -21,6 +21,18 @@ export default defineConfig({ }) ``` +You can retrieve Vitest's default options to expand them if needed: + +```ts +import { defaults } from 'vitest' + +export default defineConfig({ + test: { + exclude: [...defaults.exclude, 'packages/template/*'], + }, +}) +``` + ## Options ### include diff --git a/packages/vitest/src/constants.ts b/packages/vitest/src/constants.ts index ab74b956b6fc..7db1d2bc879a 100644 --- a/packages/vitest/src/constants.ts +++ b/packages/vitest/src/constants.ts @@ -1,11 +1,37 @@ import { fileURLToPath } from 'url' import { resolve } from 'pathe' +import type { UserConfig } from './types' +import { defaults as coverageDefaults } from './integrations/coverage' export const distDir = resolve(fileURLToPath(import.meta.url), '../../dist') export const defaultInclude = ['**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'] export const defaultExclude = ['**/node_modules/**', '**/dist/**', '**/cypress/**', '**/.{idea,git,cache,output,temp}/**'] +export const defaults: UserConfig = { + globals: false, + environment: 'node', + threads: true, + clearMocks: false, + restoreMocks: false, + mockReset: false, + include: defaultInclude, + exclude: defaultExclude, + testTimeout: 5_000, + hookTimeout: 10_000, + isolate: true, + watchIgnore: [/\/node_modules\//, /\/dist\//], + update: false, + watch: true, + reporters: 'default', + silent: false, + api: false, + ui: false, + uiBase: '/__vitest__/', + open: true, + coverage: coverageDefaults, +} + // if changed, update also jsdocs and docs export const defaultPort = 51204 diff --git a/packages/vitest/src/index.ts b/packages/vitest/src/index.ts index 0801dd93bc38..2936520894c7 100644 --- a/packages/vitest/src/index.ts +++ b/packages/vitest/src/index.ts @@ -16,6 +16,8 @@ export * from './integrations/vi' export * from './types' export * from './api/types' +export { defaults } from './constants' + declare module 'vite' { interface UserConfig { /** diff --git a/packages/vitest/src/integrations/coverage.ts b/packages/vitest/src/integrations/coverage.ts index 162b7df62174..303b46c65d55 100644 --- a/packages/vitest/src/integrations/coverage.ts +++ b/packages/vitest/src/integrations/coverage.ts @@ -21,19 +21,23 @@ const defaultExcludes = [ '**/.{eslint,mocha}rc.{js,cjs}', ] +export const defaults = { + enabled: false, + clean: true, + cleanOnRerun: false, + reportsDirectory: './coverage', + excludeNodeModules: true, + exclude: defaultExcludes, + reporter: ['text', 'html'], + allowExternal: false, + // default extensions used by c8, plus '.vue' and '.svelte' + // see https://github.com/istanbuljs/schema/blob/master/default-extension.js + extension: ['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.vue', 'svelte'], +} as ResolvedC8Options + export function resolveC8Options(options: C8Options, root: string): ResolvedC8Options { const resolved: ResolvedC8Options = { - enabled: false, - clean: true, - cleanOnRerun: false, - reportsDirectory: './coverage', - excludeNodeModules: true, - exclude: defaultExcludes, - reporter: ['text', 'html'], - allowExternal: false, - // default extensions used by c8, plus '.vue' and '.svelte' - // see https://github.com/istanbuljs/schema/blob/master/default-extension.js - extension: ['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.vue', 'svelte'], + ...defaults, ...options as any, } diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index 5c8ce57dd780..2d04dc9b09b4 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -2,7 +2,7 @@ import { resolve } from 'pathe' import type { ResolvedConfig as ResolvedViteConfig } from 'vite' import type { ApiConfig, ResolvedConfig, UserConfig } from '../types' -import { defaultExclude, defaultInclude, defaultPort } from '../constants' +import { defaultPort, defaults } from '../constants' import { resolveC8Options } from '../integrations/coverage' import { toArray } from '../utils' @@ -50,6 +50,7 @@ export function resolveConfig( const globals = options?.global ?? options.globals const resolved = { + ...defaults, ...options, root: viteConfig.root, globals, @@ -59,33 +60,16 @@ export function resolveConfig( if (viteConfig.base !== '/') resolved.base = viteConfig.base - resolved.coverage = resolveC8Options(resolved.coverage, resolved.root) + resolved.coverage = resolveC8Options(options.coverage || {}, resolved.root) resolved.deps = resolved.deps || {} - resolved.environment = resolved.environment || 'node' - resolved.threads = resolved.threads ?? true - - resolved.clearMocks = resolved.clearMocks ?? false - resolved.restoreMocks = resolved.restoreMocks ?? false - resolved.mockReset = resolved.mockReset ?? false - - resolved.include = resolved.include ?? defaultInclude - resolved.exclude = resolved.exclude ?? defaultExclude - - resolved.testTimeout = resolved.testTimeout ?? 5_000 - resolved.hookTimeout = resolved.hookTimeout ?? 10_000 - - resolved.isolate = resolved.isolate ?? true - resolved.testNamePattern = resolved.testNamePattern ? resolved.testNamePattern instanceof RegExp ? resolved.testNamePattern : new RegExp(resolved.testNamePattern) : undefined - resolved.watchIgnore = resolved.watchIgnore ?? [/\/node_modules\//, /\/dist\//] - const CI = !!process.env.CI const UPDATE_SNAPSHOT = resolved.update || process.env.UPDATE_SNAPSHOT resolved.snapshotOptions = { diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index 2f3281565c57..a7c4274a32ae 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -159,7 +159,7 @@ export interface InlineConfig { /** * Default timeout of a hook in milliseconds * - * @default 5000 + * @default 10000 */ hookTimeout?: number From 8ea5584b0ef503b468863f800472a5d1e2b5a17b Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 8 Feb 2022 14:32:58 +0300 Subject: [PATCH 2/7] chore: move coverage config to contants, rename defaults to defaultConfig --- packages/vitest/src/constants.ts | 36 +++++++++++++++++--- packages/vitest/src/index.ts | 2 +- packages/vitest/src/integrations/coverage.ts | 30 ++-------------- packages/vitest/src/node/config.ts | 4 +-- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/packages/vitest/src/constants.ts b/packages/vitest/src/constants.ts index 7db1d2bc879a..ddaed3517835 100644 --- a/packages/vitest/src/constants.ts +++ b/packages/vitest/src/constants.ts @@ -1,14 +1,40 @@ import { fileURLToPath } from 'url' import { resolve } from 'pathe' -import type { UserConfig } from './types' -import { defaults as coverageDefaults } from './integrations/coverage' +import type { ResolvedC8Options, UserConfig } from './types' export const distDir = resolve(fileURLToPath(import.meta.url), '../../dist') export const defaultInclude = ['**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'] export const defaultExclude = ['**/node_modules/**', '**/dist/**', '**/cypress/**', '**/.{idea,git,cache,output,temp}/**'] -export const defaults: UserConfig = { +const defaultCoverageExcludes = [ + 'coverage/**', + 'packages/*/test{,s}/**', + '**/*.d.ts', + 'cypress/**', + 'test{,s}/**', + 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx}', + '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx}', + '**/__tests__/**', + '**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc}.config.{js,cjs,mjs,ts}', + '**/.{eslint,mocha}rc.{js,cjs}', +] + +export const defaultCoverageConfig = Object.freeze({ + enabled: false, + clean: true, + cleanOnRerun: false, + reportsDirectory: './coverage', + excludeNodeModules: true, + exclude: defaultCoverageExcludes, + reporter: ['text', 'html'], + allowExternal: false, + // default extensions used by c8, plus '.vue' and '.svelte' + // see https://github.com/istanbuljs/schema/blob/master/default-extension.js + extension: ['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.vue', 'svelte'], +}) as ResolvedC8Options + +export const defaultConfig: UserConfig = Object.freeze({ globals: false, environment: 'node', threads: true, @@ -29,8 +55,8 @@ export const defaults: UserConfig = { ui: false, uiBase: '/__vitest__/', open: true, - coverage: coverageDefaults, -} + coverage: defaultCoverageConfig, +}) // if changed, update also jsdocs and docs export const defaultPort = 51204 diff --git a/packages/vitest/src/index.ts b/packages/vitest/src/index.ts index 2936520894c7..f16727251c60 100644 --- a/packages/vitest/src/index.ts +++ b/packages/vitest/src/index.ts @@ -16,7 +16,7 @@ export * from './integrations/vi' export * from './types' export * from './api/types' -export { defaults } from './constants' +export { defaultConfig } from './constants' declare module 'vite' { interface UserConfig { diff --git a/packages/vitest/src/integrations/coverage.ts b/packages/vitest/src/integrations/coverage.ts index 303b46c65d55..405a2bdee507 100644 --- a/packages/vitest/src/integrations/coverage.ts +++ b/packages/vitest/src/integrations/coverage.ts @@ -7,37 +7,11 @@ import type { RawSourceMap } from 'vite-node' import type { Vitest } from '../node' import { toArray } from '../utils' import type { C8Options, ResolvedC8Options } from '../types' - -const defaultExcludes = [ - 'coverage/**', - 'packages/*/test{,s}/**', - '**/*.d.ts', - 'cypress/**', - 'test{,s}/**', - 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx}', - '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx}', - '**/__tests__/**', - '**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc}.config.{js,cjs,mjs,ts}', - '**/.{eslint,mocha}rc.{js,cjs}', -] - -export const defaults = { - enabled: false, - clean: true, - cleanOnRerun: false, - reportsDirectory: './coverage', - excludeNodeModules: true, - exclude: defaultExcludes, - reporter: ['text', 'html'], - allowExternal: false, - // default extensions used by c8, plus '.vue' and '.svelte' - // see https://github.com/istanbuljs/schema/blob/master/default-extension.js - extension: ['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.vue', 'svelte'], -} as ResolvedC8Options +import { defaultCoverageConfig } from '../constants' export function resolveC8Options(options: C8Options, root: string): ResolvedC8Options { const resolved: ResolvedC8Options = { - ...defaults, + ...defaultCoverageConfig, ...options as any, } diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index 2d04dc9b09b4..7cf747c18923 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -2,7 +2,7 @@ import { resolve } from 'pathe' import type { ResolvedConfig as ResolvedViteConfig } from 'vite' import type { ApiConfig, ResolvedConfig, UserConfig } from '../types' -import { defaultPort, defaults } from '../constants' +import { defaultConfig, defaultPort } from '../constants' import { resolveC8Options } from '../integrations/coverage' import { toArray } from '../utils' @@ -50,7 +50,7 @@ export function resolveConfig( const globals = options?.global ?? options.globals const resolved = { - ...defaults, + ...defaultConfig, ...options, root: viteConfig.root, globals, From ac336c388186d8164812c8e761b7691d9657a8ed Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 8 Feb 2022 14:33:28 +0300 Subject: [PATCH 3/7] docs: rename default to defaultConfig --- docs/config/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index eddc614322c1..3a040a12ab7a 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -24,11 +24,11 @@ export default defineConfig({ You can retrieve Vitest's default options to expand them if needed: ```ts -import { defaults } from 'vitest' +import { defaultConfig } from 'vitest' export default defineConfig({ test: { - exclude: [...defaults.exclude, 'packages/template/*'], + exclude: [...defaultConfig.exclude, 'packages/template/*'], }, }) ``` From b9a70022c6c5a80a90436080847ad1e802cd8d71 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 8 Feb 2022 14:42:02 +0300 Subject: [PATCH 4/7] docs: add defineConfig to import from vitest --- 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 3a040a12ab7a..f0c67707852c 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -24,7 +24,7 @@ export default defineConfig({ You can retrieve Vitest's default options to expand them if needed: ```ts -import { defaultConfig } from 'vitest' +import { defineConfig, defaultConfig } from 'vitest' export default defineConfig({ test: { From af5ca4c09924a576fa1f806fa1e18cec7238c77c Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Wed, 9 Feb 2022 08:48:15 +0300 Subject: [PATCH 5/7] cbore: rename defaultConfig to configDefaults --- docs/config/index.md | 4 ++-- packages/vitest/src/constants.ts | 6 +++--- packages/vitest/src/index.ts | 2 +- packages/vitest/src/integrations/coverage.ts | 4 ++-- packages/vitest/src/node/config.ts | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index f0c67707852c..ff3747ff21b8 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -24,11 +24,11 @@ export default defineConfig({ You can retrieve Vitest's default options to expand them if needed: ```ts -import { defineConfig, defaultConfig } from 'vitest' +import { defineConfig, configDefaults } from 'vitest' export default defineConfig({ test: { - exclude: [...defaultConfig.exclude, 'packages/template/*'], + exclude: [...configDefaults.exclude, 'packages/template/*'], }, }) ``` diff --git a/packages/vitest/src/constants.ts b/packages/vitest/src/constants.ts index ddaed3517835..92e2ea5bf7a5 100644 --- a/packages/vitest/src/constants.ts +++ b/packages/vitest/src/constants.ts @@ -20,7 +20,7 @@ const defaultCoverageExcludes = [ '**/.{eslint,mocha}rc.{js,cjs}', ] -export const defaultCoverageConfig = Object.freeze({ +export const coverageConfigDefaults = Object.freeze({ enabled: false, clean: true, cleanOnRerun: false, @@ -34,7 +34,7 @@ export const defaultCoverageConfig = Object.freeze({ extension: ['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.vue', 'svelte'], }) as ResolvedC8Options -export const defaultConfig: UserConfig = Object.freeze({ +export const configDefaults: UserConfig = Object.freeze({ globals: false, environment: 'node', threads: true, @@ -55,7 +55,7 @@ export const defaultConfig: UserConfig = Object.freeze({ ui: false, uiBase: '/__vitest__/', open: true, - coverage: defaultCoverageConfig, + coverage: coverageConfigDefaults, }) // if changed, update also jsdocs and docs diff --git a/packages/vitest/src/index.ts b/packages/vitest/src/index.ts index f16727251c60..96389fb6a042 100644 --- a/packages/vitest/src/index.ts +++ b/packages/vitest/src/index.ts @@ -16,7 +16,7 @@ export * from './integrations/vi' export * from './types' export * from './api/types' -export { defaultConfig } from './constants' +export { configDefaults } from './constants' declare module 'vite' { interface UserConfig { diff --git a/packages/vitest/src/integrations/coverage.ts b/packages/vitest/src/integrations/coverage.ts index 405a2bdee507..912294b6977e 100644 --- a/packages/vitest/src/integrations/coverage.ts +++ b/packages/vitest/src/integrations/coverage.ts @@ -7,11 +7,11 @@ import type { RawSourceMap } from 'vite-node' import type { Vitest } from '../node' import { toArray } from '../utils' import type { C8Options, ResolvedC8Options } from '../types' -import { defaultCoverageConfig } from '../constants' +import { coverageConfigDefaults } from '../constants' export function resolveC8Options(options: C8Options, root: string): ResolvedC8Options { const resolved: ResolvedC8Options = { - ...defaultCoverageConfig, + ...coverageConfigDefaults, ...options as any, } diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index 7cf747c18923..54b601ed96ae 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -2,7 +2,7 @@ import { resolve } from 'pathe' import type { ResolvedConfig as ResolvedViteConfig } from 'vite' import type { ApiConfig, ResolvedConfig, UserConfig } from '../types' -import { defaultConfig, defaultPort } from '../constants' +import { configDefaults, defaultPort } from '../constants' import { resolveC8Options } from '../integrations/coverage' import { toArray } from '../utils' @@ -50,7 +50,7 @@ export function resolveConfig( const globals = options?.global ?? options.globals const resolved = { - ...defaultConfig, + ...configDefaults, ...options, root: viteConfig.root, globals, From fc94fc670fec13ad531c1b9e18f7b12647d9bcca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=BCller?= Date: Wed, 9 Feb 2022 14:17:59 +0100 Subject: [PATCH 6/7] feat(cli): prioritize args over config rebase (#716) --- packages/vitest/src/constants.ts | 3 ++- packages/vitest/src/node/cli.ts | 12 +++++------- packages/vitest/src/node/plugins/index.ts | 9 ++++++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/vitest/src/constants.ts b/packages/vitest/src/constants.ts index 92e2ea5bf7a5..d9c6c3d78cbe 100644 --- a/packages/vitest/src/constants.ts +++ b/packages/vitest/src/constants.ts @@ -35,6 +35,7 @@ export const coverageConfigDefaults = Object.freeze({ }) as ResolvedC8Options export const configDefaults: UserConfig = Object.freeze({ + allowOnly: !process.env.CI, globals: false, environment: 'node', threads: true, @@ -48,7 +49,7 @@ export const configDefaults: UserConfig = Object.freeze({ isolate: true, watchIgnore: [/\/node_modules\//, /\/dist\//], update: false, - watch: true, + watch: !process.env.CI, reporters: 'default', silent: false, api: false, diff --git a/packages/vitest/src/node/cli.ts b/packages/vitest/src/node/cli.ts index c2490619d179..89f8e4e04d21 100644 --- a/packages/vitest/src/node/cli.ts +++ b/packages/vitest/src/node/cli.ts @@ -16,11 +16,11 @@ cli .option('-w, --watch', 'watch mode') .option('-t, --testNamePattern ', 'run test names with the specified pattern') .option('--ui', 'enable UI') - .option('--open', 'open UI automatically', { default: true }) + .option('--open', 'open UI automatically (default: (default: !process.env.CI))') .option('--api [api]', 'serve API, available options: --api.port , --api.host [host] and --api.strictPort') - .option('--threads', 'enabled threads', { default: true }) + .option('--threads', 'enabled threads (default: true)') .option('--silent', 'silent console output from tests') - .option('--isolate', 'isolate environment for each test file', { default: true }) + .option('--isolate', 'isolate environment for each test file (default: true)') .option('--reporter ', 'reporter') .option('--outputFile ', 'write test results to a file when the --reporter=json option is also specified') .option('--coverage', 'use c8 for coverage') @@ -28,9 +28,9 @@ cli .option('--globals', 'inject apis globally') .option('--global', 'deprecated, use --globals') .option('--dom', 'mock browser api with happy-dom') - .option('--environment ', 'runner environment', { default: 'node' }) + .option('--environment ', 'runner environment (default: node)') .option('--passWithNoTests', 'pass when no tests found') - .option('--allowOnly', 'Allow tests and suites that are marked as only', { default: !process.env.CI }) + .option('--allowOnly', 'Allow tests and suites that are marked as only (default: !process.env.CI)') .help() cli @@ -62,8 +62,6 @@ async function runRelated(relatedFiles: string[] | string, argv: UserConfig) { } async function dev(cliFilters: string[], argv: UserConfig) { - if (argv.watch == null) - argv.watch = !process.env.CI && !argv.run await run(cliFilters, argv) } diff --git a/packages/vitest/src/node/plugins/index.ts b/packages/vitest/src/node/plugins/index.ts index 539f7b7c80b2..7ca6476fc609 100644 --- a/packages/vitest/src/node/plugins/index.ts +++ b/packages/vitest/src/node/plugins/index.ts @@ -1,4 +1,5 @@ import type { Plugin as VitePlugin } from 'vite' +import { configDefaults } from '../../constants' import type { UserConfig } from '../../types' import { deepMerge, ensurePackageInstalled, notNullish } from '../../utils' import { resolveApiConfig } from '../config' @@ -45,8 +46,14 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest()) }, async configResolved(viteConfig) { // viteConfig.test is final now, merge it for real - options = deepMerge(options, viteConfig.test as any || {}) + options = deepMerge( + {}, + configDefaults, + (viteConfig.test as any) || {}, + options, + ) options.api = resolveApiConfig(options) + options.watch = options.watch && !options.run }, async configureServer(server) { if (haveStarted) From 39430ccad2e7c4245f5cc2864961592d50621032 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 9 Feb 2022 16:21:08 +0300 Subject: [PATCH 7/7] Apply suggestions from code review --- packages/vitest/src/node/cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vitest/src/node/cli.ts b/packages/vitest/src/node/cli.ts index 89f8e4e04d21..f8522e0c41af 100644 --- a/packages/vitest/src/node/cli.ts +++ b/packages/vitest/src/node/cli.ts @@ -16,7 +16,7 @@ cli .option('-w, --watch', 'watch mode') .option('-t, --testNamePattern ', 'run test names with the specified pattern') .option('--ui', 'enable UI') - .option('--open', 'open UI automatically (default: (default: !process.env.CI))') + .option('--open', 'open UI automatically (default: !process.env.CI))') .option('--api [api]', 'serve API, available options: --api.port , --api.host [host] and --api.strictPort') .option('--threads', 'enabled threads (default: true)') .option('--silent', 'silent console output from tests')