vitest
Version:
A blazing fast unit test framework powered by Vite
1,627 lines (1,531 loc) • 71.5 kB
TypeScript
import { MatchersObject, MatcherState } from '@vitest/expect';
import { UserConfig as UserConfig$1, TransformResult as TransformResult$1, ViteDevServer, CommonServerOptions, DepOptimizationConfig, AliasOptions } from 'vite';
import * as _vitest_runner from '@vitest/runner';
import { Task as Task$1, Test as Test$2, TaskCustom, SequenceSetupFiles, SequenceHooks } from '@vitest/runner';
import { File, Test as Test$1, Suite, TaskResultPack, Task } from '@vitest/runner/types';
import { ParsedStack, ErrorWithDiff, ChainableFunction } from '@vitest/runner/utils';
import { Awaitable as Awaitable$1, Arrayable as Arrayable$1 } from '@vitest/utils';
import { Task as Task$2, TaskResult, Bench, Options } from 'tinybench';
import { ViteNodeRunner } from 'vite-node/client';
import { MessagePort } from 'node:worker_threads';
import { RawSourceMap, FetchResult, ViteNodeResolveId, ModuleCacheMap } from 'vite-node';
import { RawSourceMap as RawSourceMap$1 } from 'source-map';
import { Stats } from 'node:fs';
import { ViteNodeServer } from 'vite-node/server';
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
declare type Colors = {
comment: {
close: string;
open: string;
};
content: {
close: string;
open: string;
};
prop: {
close: string;
open: string;
};
tag: {
close: string;
open: string;
};
value: {
close: string;
open: string;
};
};
declare type Indent = (arg0: string) => string;
declare type Refs = Array<unknown>;
declare type Print = (arg0: unknown) => string;
declare type ThemeReceived = {
comment?: string;
content?: string;
prop?: string;
tag?: string;
value?: string;
};
declare type CompareKeys = ((a: string, b: string) => number) | undefined;
interface PrettyFormatOptions {
callToJSON?: boolean;
compareKeys?: CompareKeys;
escapeRegex?: boolean;
escapeString?: boolean;
highlight?: boolean;
indent?: number;
maxDepth?: number;
min?: boolean;
plugins?: Plugins;
printBasicPrototype?: boolean;
printFunctionName?: boolean;
theme?: ThemeReceived;
}
declare type OptionsReceived = PrettyFormatOptions;
declare type Config = {
callToJSON: boolean;
compareKeys: CompareKeys;
colors: Colors;
escapeRegex: boolean;
escapeString: boolean;
indent: string;
maxDepth: number;
min: boolean;
plugins: Plugins;
printBasicPrototype: boolean;
printFunctionName: boolean;
spacingInner: string;
spacingOuter: string;
};
declare type Printer = (val: unknown, config: Config, indentation: string, depth: number, refs: Refs, hasCalledToJSON?: boolean) => string;
declare type Test = (arg0: any) => boolean;
declare type NewPlugin = {
serialize: (val: any, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
test: Test;
};
declare type PluginOptions = {
edgeSpacing: string;
min: boolean;
spacing: string;
};
declare type OldPlugin = {
print: (val: unknown, print: Print, indent: Indent, options: PluginOptions, colors: Colors) => string;
test: Test;
};
declare type Plugin = NewPlugin | OldPlugin;
declare type Plugins = Array<Plugin>;
// Type definitions for @sinonjs/fake-timers 8.1
// Project: https://github.com/sinonjs/fake-timers
// Definitions by: Wim Looman <https://github.com/Nemo157>
// Rogier Schouten <https://github.com/rogierschouten>
// Yishai Zehavi <https://github.com/zyishai>
// Remco Haszing <https://github.com/remcohaszing>
// Jaden Simon <https://github.com/JadenSimon>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
/**
* Names of clock methods that may be faked by install.
*/
type FakeMethod =
| 'setTimeout'
| 'clearTimeout'
| 'setImmediate'
| 'clearImmediate'
| 'setInterval'
| 'clearInterval'
| 'Date'
| 'nextTick'
| 'hrtime'
| 'requestAnimationFrame'
| 'cancelAnimationFrame'
| 'requestIdleCallback'
| 'cancelIdleCallback'
| 'performance'
| 'queueMicrotask';
interface FakeTimerInstallOpts {
/**
* Installs fake timers with the specified unix epoch (default: 0)
*/
now?: number | Date | undefined;
/**
* An array with names of global methods and APIs to fake. By default, `@sinonjs/fake-timers` does not replace `nextTick()` and `queueMicrotask()`.
* For instance, `FakeTimers.install({ toFake: ['setTimeout', 'nextTick'] })` will fake only `setTimeout()` and `nextTick()`
*/
toFake?: FakeMethod[] | undefined;
/**
* The maximum number of timers that will be run when calling runAll() (default: 1000)
*/
loopLimit?: number | undefined;
/**
* Tells @sinonjs/fake-timers to increment mocked time automatically based on the real system time shift (e.g. the mocked time will be incremented by
* 20ms for every 20ms change in the real system time) (default: false)
*/
shouldAdvanceTime?: boolean | undefined;
/**
* Relevant only when using with shouldAdvanceTime: true. increment mocked time by advanceTimeDelta ms every advanceTimeDelta ms change
* in the real system time (default: 20)
*/
advanceTimeDelta?: number | undefined;
/**
* Tells FakeTimers to clear 'native' (i.e. not fake) timers by delegating to their respective handlers. These are not cleared by
* default, leading to potentially unexpected behavior if timers existed prior to installing FakeTimers. (default: false)
*/
shouldClearNativeTimers?: boolean | undefined;
}
declare class SnapshotManager {
options: SnapshotStateOptions;
summary: SnapshotSummary;
extension: string;
constructor(options: SnapshotStateOptions);
clear(): void;
add(result: SnapshotResult): void;
resolvePath(testPath: string): string;
}
interface ParsedFile extends File {
start: number;
end: number;
}
interface ParsedTest extends Test$1 {
start: number;
end: number;
}
interface ParsedSuite extends Suite {
start: number;
end: number;
}
interface LocalCallDefinition {
start: number;
end: number;
name: string;
type: 'suite' | 'test';
mode: 'run' | 'skip' | 'only' | 'todo';
task: ParsedSuite | ParsedFile | ParsedTest;
}
interface FileInformation {
file: File;
filepath: string;
parsed: string;
map: RawSourceMap | null;
definitions: LocalCallDefinition[];
}
declare class TypeCheckError extends Error {
message: string;
stacks: ParsedStack[];
name: string;
constructor(message: string, stacks: ParsedStack[]);
}
interface ErrorsCache {
files: File[];
sourceErrors: TypeCheckError[];
}
type Callback<Args extends Array<any> = []> = (...args: Args) => Awaitable<void>;
declare class Typechecker {
protected ctx: Vitest;
protected files: string[];
private _onParseStart?;
private _onParseEnd?;
private _onWatcherRerun?;
private _result;
private _tests;
private tempConfigPath?;
private allowJs?;
private process;
constructor(ctx: Vitest, files: string[]);
onParseStart(fn: Callback): void;
onParseEnd(fn: Callback<[ErrorsCache]>): void;
onWatcherRerun(fn: Callback): void;
protected collectFileTests(filepath: string): Promise<FileInformation | null>;
protected getFiles(): string[];
collectTests(): Promise<Record<string, FileInformation>>;
protected markPassed(file: File): void;
protected prepareResults(output: string): Promise<{
files: File[];
sourceErrors: TypeCheckError[];
}>;
protected parseTscLikeOutput(output: string): Promise<Map<string, {
error: TypeCheckError;
originalError: TscErrorInfo;
}[]>>;
clear(): Promise<void>;
stop(): Promise<void>;
protected ensurePackageInstalled(root: string, checker: string): Promise<void>;
prepare(): Promise<void>;
start(): Promise<void>;
getResult(): ErrorsCache;
getTestFiles(): File[];
getTestPacks(): TaskResultPack[];
}
type RunWithFiles = (files: string[], invalidates?: string[]) => Promise<void>;
interface ProcessPool {
runTests: RunWithFiles;
close: () => Promise<void>;
}
interface BrowserProvider {
initialize(ctx: Vitest): Awaitable$1<void>;
createPool(): ProcessPool;
testFinished?(testId: string): Awaitable$1<void>;
}
interface BrowserConfigOptions {
/**
* if running tests in the broweser should be the default
*
* @default false
*/
enabled?: boolean;
/**
* Name of the browser
*
* @default tries to find the first available browser
*/
name?: 'firefox' | 'chrome' | 'edge' | 'safari';
/**
* browser provider
*
* @default 'webdriver'
*/
provider?: string;
/**
* enable headless mode
*
* @default process.env.CI
*/
headless?: boolean;
/**
* Serve API options.
*
* The default port is 63315.
*/
api?: ApiConfig | number;
}
interface ResolvedBrowserOptions extends BrowserConfigOptions {
enabled: boolean;
headless: boolean;
api: ApiConfig;
}
interface CollectingPromise {
promise: Promise<void>;
resolve: () => void;
}
declare class StateManager {
filesMap: Map<string, File>;
pathsSet: Set<string>;
collectingPromise: CollectingPromise | undefined;
idMap: Map<string, Task>;
taskFileMap: WeakMap<Task, File>;
errorsSet: Set<unknown>;
processTimeoutCauses: Set<string>;
catchError(err: unknown, type: string): void;
clearErrors(): void;
getUnhandledErrors(): unknown[];
addProcessTimeoutCause(cause: string): void;
getProcessTimeoutCauses(): string[];
getPaths(): string[];
getFiles(keys?: string[]): File[];
getFilepaths(): string[];
getFailedFilepaths(): string[];
collectPaths(paths?: string[]): void;
collectFiles(files?: File[]): void;
clearFiles(paths?: string[]): void;
updateId(task: Task): void;
updateTasks(packs: TaskResultPack[]): void;
updateUserLog(log: UserConsoleLog): void;
}
declare class Logger {
ctx: Vitest;
console: Console;
outputStream: NodeJS.WriteStream & {
fd: 1;
};
errorStream: NodeJS.WriteStream & {
fd: 2;
};
logUpdate: ((...text: string[]) => void) & {
clear(): void;
done(): void;
};
private _clearScreenPending;
constructor(ctx: Vitest, console?: Console);
log(...args: any[]): void;
error(...args: any[]): void;
warn(...args: any[]): void;
clearFullScreen(message: string): void;
clearScreen(message: string, force?: boolean): void;
private _clearScreen;
printError(err: unknown, fullStack?: boolean, type?: string): Promise<void>;
printNoTestFound(filters?: string[]): void;
printBanner(): void;
printUnhandledErrors(errors: unknown[]): Promise<void>;
printSourceTypeErrors(errors: TypeCheckError[]): Promise<void>;
}
interface SuiteResultCache {
failed: boolean;
duration: number;
}
declare class ResultsCache {
private cache;
private cachePath;
private version;
private root;
getCachePath(): string | null;
setConfig(root: string, config: ResolvedConfig['cache']): void;
getResults(fsPath: string): SuiteResultCache | undefined;
readFromCache(): Promise<void>;
updateResults(files: File[]): void;
removeFromCache(filepath: string): void;
writeToCache(): Promise<void>;
}
interface CliOptions extends UserConfig {
/**
* Override the watch mode
*/
run?: boolean;
}
/**
* Start Vitest programmatically
*
* Returns a Vitest instance if initialized successfully.
*/
declare function startVitest(mode: VitestRunMode, cliFilters: string[], options: CliOptions, viteOverrides?: UserConfig$1): Promise<Vitest | undefined>;
type FileStatsCache = Pick<Stats, 'size'>;
declare class FilesStatsCache {
cache: Map<string, FileStatsCache>;
getStats(fsPath: string): FileStatsCache | undefined;
updateStats(fsPath: string): Promise<void>;
removeStats(fsPath: string): void;
}
declare class VitestCache {
results: ResultsCache;
stats: FilesStatsCache;
getFileTestResults(id: string): SuiteResultCache | undefined;
getFileStats(id: string): {
size: number;
} | undefined;
static resolveCacheDir(root: string, dir: string | undefined): string;
static clearCache(options: CliOptions): Promise<{
dir: string;
cleared: boolean;
}>;
}
declare class VitestServer extends ViteNodeServer {
private _vitestPath?;
private getVitestPath;
protected processTransformResult(result: TransformResult$1): Promise<TransformResult$1>;
}
declare class Vitest {
readonly mode: VitestRunMode;
config: ResolvedConfig;
configOverride: Partial<ResolvedConfig> | undefined;
browser: ViteDevServer;
server: ViteDevServer;
state: StateManager;
snapshot: SnapshotManager;
cache: VitestCache;
reporters: Reporter[];
coverageProvider: CoverageProvider | null | undefined;
browserProvider: BrowserProvider | undefined;
logger: Logger;
pool: ProcessPool | undefined;
typechecker: Typechecker | undefined;
vitenode: VitestServer;
invalidates: Set<string>;
changedTests: Set<string>;
filenamePattern?: string;
runningPromise?: Promise<void>;
closingPromise?: Promise<void>;
isFirstRun: boolean;
restartsCount: number;
runner: ViteNodeRunner;
constructor(mode: VitestRunMode);
private _onRestartListeners;
private _onSetServer;
initBrowserServer(options: UserConfig): Promise<void>;
setServer(options: UserConfig, server: ViteDevServer): Promise<void>;
initCoverageProvider(): Promise<CoverageProvider | null | undefined>;
initBrowserProvider(): Promise<BrowserProvider>;
getSerializableConfig(): ResolvedConfig;
typecheck(filters?: string[]): Promise<void>;
start(filters?: string[]): Promise<void>;
private getTestDependencies;
filterTestsBySource(tests: string[]): Promise<string[]>;
runFiles(paths: string[]): Promise<void>;
rerunFiles(files?: string[], trigger?: string): Promise<void>;
changeNamePattern(pattern: string, files?: string[], trigger?: string): Promise<void>;
changeFilenamePattern(pattern: string): Promise<void>;
rerunFailed(): Promise<void>;
updateSnapshot(files?: string[]): Promise<void>;
private _rerunTimer;
private scheduleRerun;
private unregisterWatcher;
private registerWatcher;
/**
* @returns A value indicating whether rerun is needed (changedTests was mutated)
*/
private handleFileChanged;
private reportCoverage;
close(): Promise<void>;
/**
* Close the thread pool and exit the process
*/
exit(force?: boolean): Promise<void>;
report<T extends keyof Reporter>(name: T, ...args: ArgumentsType$1<Reporter[T]>): Promise<void>;
globFiles(include: string[], exclude: string[], cwd: string): Promise<string[]>;
private _allTestsCache;
globAllTestFiles(config: ResolvedConfig, cwd: string): Promise<string[]>;
filterFiles(testFiles: string[], filters?: string[]): string[];
globTestFiles(filters?: string[]): Promise<string[]>;
isTargetFile(id: string, source?: string): Promise<boolean>;
isBrowserEnabled(): boolean;
shouldKeepServer(): boolean;
isInSourceTestFile(code: string): boolean;
onServerRestart(fn: OnServerRestartHandler): void;
onAfterSetServer(fn: OnServerRestartHandler): void;
}
type MockFactoryWithHelper = (importOriginal: <T = unknown>() => Promise<T>) => any;
type MockFactory = () => any;
type MockMap = Map<string, Record<string, string | null | MockFactory>>;
interface TestSequencer {
/**
* Slicing tests into shards. Will be run before `sort`.
* Only run, if `shard` is defined.
*/
shard(files: string[]): Awaitable<string[]>;
sort(files: string[]): Awaitable<string[]>;
}
interface TestSequencerConstructor {
new (ctx: Vitest): TestSequencer;
}
declare abstract class BaseReporter implements Reporter {
start: number;
end: number;
watchFilters?: string[];
isTTY: boolean;
ctx: Vitest;
private _filesInWatchMode;
private _lastRunTimeout;
private _lastRunTimer;
private _lastRunCount;
private _timeStart;
constructor();
get mode(): VitestRunMode;
onInit(ctx: Vitest): void;
relative(path: string): string;
onFinished(files?: File[], errors?: unknown[]): Promise<void>;
onTaskUpdate(packs: TaskResultPack[]): void;
onWatcherStart(files?: File[], errors?: unknown[]): Promise<void>;
private resetLastRunLog;
onWatcherRerun(files: string[], trigger?: string): Promise<void>;
onUserConsoleLog(log: UserConsoleLog): void;
shouldLog(log: UserConsoleLog): boolean;
onServerRestart(reason?: string): void;
reportSummary(files: File[]): Promise<void>;
reportTestSummary(files: File[]): Promise<void>;
private printErrorsSummary;
reportBenchmarkSummary(files: File[]): Promise<void>;
private printTaskErrors;
registerUnhandledRejection(): void;
}
declare class BasicReporter extends BaseReporter {
isTTY: boolean;
reportSummary(files: File[]): Promise<void>;
}
type Awaitable<T> = T | PromiseLike<T>;
type Nullable<T> = T | null | undefined;
type Arrayable<T> = T | Array<T>;
type ArgumentsType$1<T> = T extends (...args: infer U) => any ? U : never;
type MutableArray<T extends readonly any[]> = {
-readonly [k in keyof T]: T[k];
};
interface Constructable {
new (...args: any[]): any;
}
interface ModuleCache {
promise?: Promise<any>;
exports?: any;
code?: string;
}
interface EnvironmentReturn {
teardown: (global: any) => Awaitable<void>;
}
interface Environment {
name: string;
setup(global: any, options: Record<string, any>): Awaitable<EnvironmentReturn>;
}
interface UserConsoleLog {
content: string;
type: 'stdout' | 'stderr';
taskId?: string;
time: number;
size: number;
}
interface ModuleGraphData {
graph: Record<string, string[]>;
externalized: string[];
inlined: string[];
}
type OnServerRestartHandler = (reason?: string) => Promise<void> | void;
interface ListRendererOptions$1 {
renderSucceed?: boolean;
logger: Logger;
showHeap: boolean;
mode: VitestRunMode;
}
declare const createListRenderer: (_tasks: Task[], options: ListRendererOptions$1) => {
start(): any;
update(_tasks: Task[]): any;
stop(): Promise<any>;
clear(): void;
};
declare class DefaultReporter extends BaseReporter {
renderer?: ReturnType<typeof createListRenderer>;
rendererOptions: ListRendererOptions$1;
onTestRemoved(trigger?: string): Promise<void>;
onCollected(): void;
onFinished(files?: _vitest_runner.File[], errors?: unknown[]): Promise<void>;
onWatcherStart(files?: _vitest_runner.File[], errors?: unknown[]): Promise<void>;
stopListRender(): Promise<void>;
onWatcherRerun(files: string[], trigger?: string): Promise<void>;
onUserConsoleLog(log: UserConsoleLog): void;
}
declare class DotReporter extends BaseReporter {
renderer?: ReturnType<typeof createListRenderer>;
onCollected(): void;
onFinished(files?: _vitest_runner.File[], errors?: unknown[]): Promise<void>;
onWatcherStart(): Promise<void>;
stopListRender(): Promise<void>;
onWatcherRerun(files: string[], trigger?: string): Promise<void>;
onUserConsoleLog(log: UserConsoleLog): void;
}
interface Callsite {
line: number;
column: number;
}
declare class JsonReporter$1 implements Reporter {
start: number;
ctx: Vitest;
onInit(ctx: Vitest): void;
protected logTasks(files: File[]): Promise<void>;
onFinished(files?: File[]): Promise<void>;
/**
* Writes the report to an output file if specified in the config,
* or logs it to the console otherwise.
* @param report
*/
writeReport(report: string): Promise<void>;
protected getFailureLocation(test: Task): Promise<Callsite | undefined>;
}
declare class VerboseReporter extends DefaultReporter {
constructor();
onTaskUpdate(packs: TaskResultPack[]): void;
}
interface Reporter {
onInit?(ctx: Vitest): void;
onPathsCollected?: (paths?: string[]) => Awaitable<void>;
onCollected?: (files?: File[]) => Awaitable<void>;
onFinished?: (files?: File[], errors?: unknown[]) => Awaitable<void>;
onTaskUpdate?: (packs: TaskResultPack[]) => Awaitable<void>;
onTestRemoved?: (trigger?: string) => Awaitable<void>;
onWatcherStart?: (files?: File[], errors?: unknown[]) => Awaitable<void>;
onWatcherRerun?: (files: string[], trigger?: string) => Awaitable<void>;
onServerRestart?: (reason?: string) => Awaitable<void>;
onUserConsoleLog?: (log: UserConsoleLog) => Awaitable<void>;
onProcessTimeout?: () => Awaitable<void>;
}
declare class TapReporter implements Reporter {
protected ctx: Vitest;
private logger;
onInit(ctx: Vitest): void;
static getComment(task: Task$1): string;
private logErrorDetails;
protected logTasks(tasks: Task$1[]): void;
onFinished(files?: _vitest_runner.File[]): Promise<void>;
}
declare class JUnitReporter implements Reporter {
private ctx;
private reportFile?;
private baseLog;
private logger;
private _timeStart;
onInit(ctx: Vitest): Promise<void>;
writeElement(name: string, attrs: Record<string, any>, children: () => Promise<void>): Promise<void>;
writeErrorDetails(error: ErrorWithDiff): Promise<void>;
writeLogs(task: Task$1, type: 'err' | 'out'): Promise<void>;
writeTasks(tasks: Task$1[], filename: string): Promise<void>;
onFinished(files?: _vitest_runner.File[]): Promise<void>;
}
declare class TapFlatReporter extends TapReporter {
onInit(ctx: Vitest): void;
onFinished(files?: _vitest_runner.File[]): Promise<void>;
}
declare class HangingProcessReporter implements Reporter {
whyRunning: (() => void) | undefined;
onInit(): void;
onProcessTimeout(): void;
}
declare class JsonReporter implements Reporter {
start: number;
ctx: Vitest;
onInit(ctx: Vitest): void;
protected logTasks(files: File[]): Promise<void>;
onFinished(files?: File[]): Promise<void>;
/**
* Writes the report to an output file if specified in the config,
* or logs it to the console otherwise.
* @param report
*/
writeReport(report: string): Promise<void>;
}
interface ListRendererOptions {
renderSucceed?: boolean;
logger: Logger;
showHeap: boolean;
}
declare const createTableRenderer: (_tasks: Task[], options: ListRendererOptions) => {
start(): any;
update(_tasks: Task[]): any;
stop(): Promise<any>;
clear(): void;
};
declare class TableReporter extends BaseReporter {
renderer?: ReturnType<typeof createTableRenderer>;
rendererOptions: ListRendererOptions$1;
onTestRemoved(trigger?: string): Promise<void>;
onCollected(): void;
onFinished(files?: _vitest_runner.File[], errors?: unknown[]): Promise<void>;
onWatcherStart(): Promise<void>;
stopListRender(): Promise<void>;
onWatcherRerun(files: string[], trigger?: string): Promise<void>;
onUserConsoleLog(log: UserConsoleLog): void;
}
declare const BenchmarkReportsMap: {
default: typeof TableReporter;
verbose: typeof VerboseReporter;
json: typeof JsonReporter;
};
type BenchmarkBuiltinReporters = keyof typeof BenchmarkReportsMap;
declare const ReportersMap: {
default: typeof DefaultReporter;
basic: typeof BasicReporter;
verbose: typeof VerboseReporter;
dot: typeof DotReporter;
json: typeof JsonReporter$1;
tap: typeof TapReporter;
'tap-flat': typeof TapFlatReporter;
junit: typeof JUnitReporter;
'hanging-process': typeof HangingProcessReporter;
};
type BuiltinReporters = keyof typeof ReportersMap;
interface RollupError extends RollupLogProps {
parserError?: Error;
stack?: string;
watchFiles?: string[];
}
interface RollupWarning extends RollupLogProps {
chunkName?: string;
cycle?: string[];
exportName?: string;
exporter?: string;
guess?: string;
importer?: string;
missing?: string;
modules?: string[];
names?: string[];
reexporter?: string;
source?: string;
sources?: string[];
}
interface RollupLogProps {
code?: string;
frame?: string;
hook?: string;
id?: string;
loc?: {
column: number;
file?: string;
line: number;
};
message: string;
name?: string;
plugin?: string;
pluginCode?: string;
pos?: number;
url?: string;
}
interface ExistingRawSourceMap {
file?: string;
mappings: string;
names: string[];
sourceRoot?: string;
sources: string[];
sourcesContent?: string[];
version: number;
}
interface SourceMap {
file: string;
mappings: string;
names: string[];
sources: string[];
sourcesContent: string[];
version: number;
toString(): string;
toUrl(): string;
}
type SourceMapInput = ExistingRawSourceMap | string | null | { mappings: '' };
type PartialNull<T> = {
[P in keyof T]: T[P] | null;
};
interface ModuleOptions {
meta: CustomPluginOptions;
moduleSideEffects: boolean | 'no-treeshake';
syntheticNamedExports: boolean | string;
}
interface SourceDescription extends Partial<PartialNull<ModuleOptions>> {
ast?: AcornNode;
code: string;
map?: SourceMapInput;
}
interface PluginCache {
delete(id: string): boolean;
get<T = any>(id: string): T;
has(id: string): boolean;
set<T = any>(id: string, value: T): void;
}
interface MinimalPluginContext {
meta: PluginContextMeta;
}
interface EmittedAsset {
fileName?: string;
name?: string;
source?: string | Uint8Array;
type: 'asset';
}
interface EmittedChunk {
fileName?: string;
id: string;
implicitlyLoadedAfterOneOf?: string[];
importer?: string;
name?: string;
preserveSignature?: PreserveEntrySignaturesOption;
type: 'chunk';
}
type EmittedFile = EmittedAsset | EmittedChunk;
type EmitAsset = (name: string, source?: string | Uint8Array) => string;
type EmitChunk = (id: string, options?: { name?: string }) => string;
type EmitFile = (emittedFile: EmittedFile) => string;
interface ModuleInfo extends ModuleOptions {
ast: AcornNode | null;
code: string | null;
dynamicImporters: readonly string[];
dynamicallyImportedIdResolutions: readonly ResolvedId[];
dynamicallyImportedIds: readonly string[];
hasDefaultExport: boolean | null;
/** @deprecated Use `moduleSideEffects` instead */
hasModuleSideEffects: boolean | 'no-treeshake';
id: string;
implicitlyLoadedAfterOneOf: readonly string[];
implicitlyLoadedBefore: readonly string[];
importedIdResolutions: readonly ResolvedId[];
importedIds: readonly string[];
importers: readonly string[];
isEntry: boolean;
isExternal: boolean;
isIncluded: boolean | null;
}
type GetModuleInfo = (moduleId: string) => ModuleInfo | null;
interface CustomPluginOptions {
[plugin: string]: any;
}
interface PluginContext extends MinimalPluginContext {
addWatchFile: (id: string) => void;
cache: PluginCache;
/** @deprecated Use `this.emitFile` instead */
emitAsset: EmitAsset;
/** @deprecated Use `this.emitFile` instead */
emitChunk: EmitChunk;
emitFile: EmitFile;
error: (err: RollupError | string, pos?: number | { column: number; line: number }) => never;
/** @deprecated Use `this.getFileName` instead */
getAssetFileName: (assetReferenceId: string) => string;
/** @deprecated Use `this.getFileName` instead */
getChunkFileName: (chunkReferenceId: string) => string;
getFileName: (fileReferenceId: string) => string;
getModuleIds: () => IterableIterator<string>;
getModuleInfo: GetModuleInfo;
getWatchFiles: () => string[];
/** @deprecated Use `this.resolve` instead */
isExternal: IsExternal;
load: (
options: { id: string; resolveDependencies?: boolean } & Partial<PartialNull<ModuleOptions>>
) => Promise<ModuleInfo>;
/** @deprecated Use `this.getModuleIds` instead */
moduleIds: IterableIterator<string>;
parse: (input: string, options?: any) => AcornNode;
resolve: (
source: string,
importer?: string,
options?: { custom?: CustomPluginOptions; isEntry?: boolean; skipSelf?: boolean }
) => Promise<ResolvedId | null>;
/** @deprecated Use `this.resolve` instead */
resolveId: (source: string, importer?: string) => Promise<string | null>;
setAssetSource: (assetReferenceId: string, source: string | Uint8Array) => void;
warn: (warning: RollupWarning | string, pos?: number | { column: number; line: number }) => void;
}
interface PluginContextMeta {
rollupVersion: string;
watchMode: boolean;
}
interface ResolvedId extends ModuleOptions {
external: boolean | 'absolute';
id: string;
}
type IsExternal = (
source: string,
importer: string | undefined,
isResolved: boolean
) => boolean;
interface TransformPluginContext extends PluginContext {
getCombinedSourcemap: () => SourceMap;
}
type TransformResult = string | null | void | Partial<SourceDescription>;
type PreserveEntrySignaturesOption = false | 'strict' | 'allow-extension' | 'exports-only';
interface AcornNode {
end: number;
start: number;
type: string;
}
// Type definitions for istanbul-lib-report 3.0
interface Node {
isRoot(): boolean;
visit(visitor: Visitor, state: any): void;
}
interface Visitor<N extends Node = Node> {
onStart(root: N, state: any): void;
onSummary(root: N, state: any): void;
onDetail(root: N, state: any): void;
onSummaryEnd(root: N, state: any): void;
onEnd(root: N, state: any): void;
}
// Type definitions for istanbul-reports 3.0
interface FileOptions {
file: string;
}
interface ProjectOptions {
projectRoot: string;
}
interface ReportOptions {
clover: CloverOptions;
cobertura: CoberturaOptions;
'html-spa': HtmlSpaOptions;
html: HtmlOptions;
json: JsonOptions;
'json-summary': JsonSummaryOptions;
lcov: LcovOptions;
lcovonly: LcovOnlyOptions;
none: never;
teamcity: TeamcityOptions;
text: TextOptions;
'text-lcov': TextLcovOptions;
'text-summary': TextSummaryOptions;
}
interface CloverOptions extends FileOptions, ProjectOptions {}
interface CoberturaOptions extends FileOptions, ProjectOptions {}
interface HtmlSpaOptions extends HtmlOptions {
metricsToShow: Array<'lines' | 'branches' | 'functions' | 'statements'>;
}
interface HtmlOptions {
verbose: boolean;
skipEmpty: boolean;
subdir: string;
linkMapper: LinkMapper;
}
type JsonOptions = FileOptions;
type JsonSummaryOptions = FileOptions;
interface LcovOptions extends FileOptions, ProjectOptions {}
interface LcovOnlyOptions extends FileOptions, ProjectOptions {}
interface TeamcityOptions extends FileOptions {
blockName: string;
}
interface TextOptions extends FileOptions {
maxCols: number;
skipEmpty: boolean;
skipFull: boolean;
}
type TextLcovOptions = ProjectOptions;
type TextSummaryOptions = FileOptions;
interface LinkMapper {
getPath(node: string | Node): string;
relativePath(source: string | Node, target: string | Node): string;
assetPath(node: Node, name: string): string;
}
declare type ArgumentsType<T> = T extends (...args: infer A) => any ? A : never;
declare type ReturnType$1<T> = T extends (...args: any) => infer R ? R : never;
declare type PromisifyFn<T> = ReturnType$1<T> extends Promise<any> ? T : (...args: ArgumentsType<T>) => Promise<Awaited<ReturnType$1<T>>>;
declare type BirpcFn<T> = PromisifyFn<T> & {
/**
* Send event without asking for response
*/
asEvent(...args: ArgumentsType<T>): void;
};
declare type BirpcReturn<RemoteFunctions> = {
[K in keyof RemoteFunctions]: BirpcFn<RemoteFunctions[K]>;
};
type SnapshotData = Record<string, string>;
type SnapshotUpdateState = 'all' | 'new' | 'none';
interface SnapshotStateOptions {
updateSnapshot: SnapshotUpdateState;
expand?: boolean;
snapshotFormat?: OptionsReceived;
resolveSnapshotPath?: (path: string, extension: string) => string;
}
interface SnapshotMatchOptions {
testName: string;
received: unknown;
key?: string;
inlineSnapshot?: string;
isInline: boolean;
error?: Error;
}
interface SnapshotResult {
filepath: string;
added: number;
fileDeleted: boolean;
matched: number;
unchecked: number;
uncheckedKeys: Array<string>;
unmatched: number;
updated: number;
}
interface UncheckedSnapshot {
filePath: string;
keys: Array<string>;
}
interface SnapshotSummary {
added: number;
didUpdate: boolean;
failure: boolean;
filesAdded: number;
filesRemoved: number;
filesRemovedList: Array<string>;
filesUnmatched: number;
filesUpdated: number;
matched: number;
total: number;
unchecked: number;
uncheckedKeysByFile: Array<UncheckedSnapshot>;
unmatched: number;
updated: number;
}
interface RuntimeRPC {
fetch: (id: string, environment: VitestEnvironment) => Promise<FetchResult>;
resolveId: (id: string, importer: string | undefined, environment: VitestEnvironment) => Promise<ViteNodeResolveId | null>;
getSourceMap: (id: string, force?: boolean) => Promise<RawSourceMap$1 | undefined>;
onFinished: (files: File[], errors?: unknown[]) => void;
onWorkerExit: (error: unknown, code?: number) => void;
onPathsCollected: (paths: string[]) => void;
onUserConsoleLog: (log: UserConsoleLog) => void;
onUnhandledError: (err: unknown, type: string) => void;
onCollected: (files: File[]) => void;
onAfterSuiteRun: (meta: AfterSuiteRunMeta) => void;
onTaskUpdate: (pack: TaskResultPack[]) => void;
snapshotSaved: (snapshot: SnapshotResult) => void;
resolveSnapshotPath: (testPath: string) => string;
}
interface ContextTestEnvironment {
name: VitestEnvironment;
options: EnvironmentOptions | null;
}
interface ContextRPC {
config: ResolvedConfig;
files: string[];
invalidates?: string[];
environment: ContextTestEnvironment;
}
interface WorkerContext extends ContextRPC {
workerId: number;
port: MessagePort;
}
type ResolveIdFunction = (id: string, importer?: string) => Promise<ViteNodeResolveId | null>;
interface AfterSuiteRunMeta {
coverage?: unknown;
}
interface WorkerGlobalState {
ctx: WorkerContext;
config: ResolvedConfig;
rpc: BirpcReturn<RuntimeRPC>;
current?: Test$2;
filepath?: string;
environmentTeardownRun?: boolean;
moduleCache: ModuleCacheMap;
mockMap: MockMap;
}
interface CoverageProvider {
name: string;
initialize(ctx: Vitest): Promise<void> | void;
resolveOptions(): ResolvedCoverageOptions;
clean(clean?: boolean): void | Promise<void>;
onAfterSuiteRun(meta: AfterSuiteRunMeta): void | Promise<void>;
reportCoverage(reportContext?: ReportContext): void | Promise<void>;
onFileTransform?(sourceCode: string, id: string, pluginCtx: TransformPluginContext): TransformResult | Promise<TransformResult>;
}
interface ReportContext {
/** Indicates whether all tests were run. False when only specific tests were run. */
allTestsRun?: boolean;
}
interface CoverageProviderModule {
/**
* Factory for creating a new coverage provider
*/
getProvider(): CoverageProvider | Promise<CoverageProvider>;
/**
* Executed before tests are run in the worker thread.
*/
startCoverage?(): unknown | Promise<unknown>;
/**
* Executed on after each run in the worker thread. Possible to return a payload passed to the provider
*/
takeCoverage?(): unknown | Promise<unknown>;
/**
* Executed after all tests have been run in the worker thread.
*/
stopCoverage?(): unknown | Promise<unknown>;
}
type CoverageReporter = keyof ReportOptions;
type CoverageReporterWithOptions<ReporterName extends CoverageReporter = CoverageReporter> = ReporterName extends CoverageReporter ? ReportOptions[ReporterName] extends never ? [ReporterName, {}] : [ReporterName, Partial<ReportOptions[ReporterName]>] : never;
type Provider = 'c8' | 'istanbul' | 'custom' | undefined;
type CoverageOptions<T extends Provider = Provider> = T extends 'istanbul' ? ({
provider: T;
} & CoverageIstanbulOptions) : T extends 'c8' ? ({
provider: T;
} & CoverageC8Options) : T extends 'custom' ? ({
provider: T;
} & CustomProviderOptions) : ({
provider?: T;
} & (CoverageC8Options));
/** Fields that have default values. Internally these will always be defined. */
type FieldsWithDefaultValues = 'enabled' | 'clean' | 'cleanOnRerun' | 'reportsDirectory' | 'exclude' | 'extension';
type ResolvedCoverageOptions<T extends Provider = Provider> = CoverageOptions<T> & Required<Pick<CoverageOptions<T>, FieldsWithDefaultValues>> & {
reporter: CoverageReporterWithOptions[];
};
interface BaseCoverageOptions {
/**
* Enables coverage collection. Can be overridden using `--coverage` CLI option.
*
* @default false
*/
enabled?: boolean;
/**
* List of files included in coverage as glob patterns
*
* @default ['**']
*/
include?: string[];
/**
* Extensions for files to be included in coverage
*
* @default ['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.vue', '.svelte']
*/
extension?: string | string[];
/**
* List of files excluded from coverage as glob patterns
*/
exclude?: string[];
/**
* Whether to include all files, including the untested ones into report
*
* @default false
*/
all?: boolean;
/**
* Clean coverage results before running tests
*
* @default true
*/
clean?: boolean;
/**
* Clean coverage report on watch rerun
*
* @default true
*/
cleanOnRerun?: boolean;
/**
* Directory to write coverage report to
*/
reportsDirectory?: string;
/**
* Coverage reporters to use.
* See [istanbul documentation](https://istanbul.js.org/docs/advanced/alternative-reporters/) for detailed list of all reporters.
*
* @default ['text', 'html', 'clover', 'json']
*/
reporter?: Arrayable<CoverageReporter> | (CoverageReporter | [CoverageReporter] | CoverageReporterWithOptions)[];
/**
* Do not show files with 100% statement, branch, and function coverage
*
* @default false
*/
skipFull?: boolean;
/**
* Check thresholds per file.
* See `lines`, `functions`, `branches` and `statements` for the actual thresholds.
*
* @default false
*/
perFile?: boolean;
/**
* Threshold for lines
*
* @default undefined
*/
lines?: number;
/**
* Threshold for functions
*
* @default undefined
*/
functions?: number;
/**
* Threshold for branches
*
* @default undefined
*/
branches?: number;
/**
* Threshold for statements
*
* @default undefined
*/
statements?: number;
/**
* Update threshold values automatically when current coverage is higher than earlier thresholds
*
* @default false
*/
thresholdAutoUpdate?: boolean;
}
interface CoverageIstanbulOptions extends BaseCoverageOptions {
/**
* Set to array of class method names to ignore for coverage
*
* @default []
*/
ignoreClassMethods?: string[];
/**
* Watermarks for statements, lines, branches and functions.
*
* Default value is `[50,80]` for each property.
*/
watermarks?: {
statements?: [number, number];
functions?: [number, number];
branches?: [number, number];
lines?: [number, number];
};
}
interface CoverageC8Options extends BaseCoverageOptions {
/**
* Allow files from outside of your cwd.
*
* @default false
*/
allowExternal?: boolean;
/**
* Exclude coverage under `/node_modules/`
*
* @default true
*/
excludeNodeModules?: boolean;
/**
* Specifies the directories that are used when `--all` is enabled.
*
* @default cwd
*/
src?: string[];
/**
* Shortcut for `--check-coverage --lines 100 --functions 100 --branches 100 --statements 100`
*
* @default false
*/
100?: boolean;
}
interface CustomProviderOptions extends Pick<BaseCoverageOptions, FieldsWithDefaultValues> {
/** Name of the module or path to a file to load the custom provider from */
customProviderModule: string;
}
interface JSDOMOptions {
/**
* The html content for the test.
*
* @default '<!DOCTYPE html>'
*/
html?: string | Buffer | ArrayBufferLike;
/**
* referrer just affects the value read from document.referrer.
* It defaults to no referrer (which reflects as the empty string).
*/
referrer?: string;
/**
* userAgent affects the value read from navigator.userAgent, as well as the User-Agent header sent while fetching subresources.
*
* @default `Mozilla/5.0 (${process.platform}) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/${jsdomVersion}`
*/
userAgent?: string;
/**
* url sets the value returned by window.location, document.URL, and document.documentURI,
* and affects things like resolution of relative URLs within the document
* and the same-origin restrictions and referrer used while fetching subresources.
*
* @default 'http://localhost:3000'.
*/
url?: string;
/**
* contentType affects the value read from document.contentType, and how the document is parsed: as HTML or as XML.
* Values that are not "text/html" or an XML mime type will throw.
*
* @default 'text/html'.
*/
contentType?: string;
/**
* The maximum size in code units for the separate storage areas used by localStorage and sessionStorage.
* Attempts to store data larger than this limit will cause a DOMException to be thrown. By default, it is set
* to 5,000,000 code units per origin, as inspired by the HTML specification.
*
* @default 5_000_000
*/
storageQuota?: number;
/**
* Enable console?
*
* @default false
*/
console?: boolean;
/**
* jsdom does not have the capability to render visual content, and will act like a headless browser by default.
* It provides hints to web pages through APIs such as document.hidden that their content is not visible.
*
* When the `pretendToBeVisual` option is set to `true`, jsdom will pretend that it is rendering and displaying
* content.
*
* @default true
*/
pretendToBeVisual?: boolean;
/**
* `includeNodeLocations` preserves the location info produced by the HTML parser,
* allowing you to retrieve it with the nodeLocation() method (described below).
*
* It defaults to false to give the best performance,
* and cannot be used with an XML content type since our XML parser does not support location info.
*
* @default false
*/
includeNodeLocations?: boolean | undefined;
/**
* @default 'dangerously'
*/
runScripts?: 'dangerously' | 'outside-only';
/**
* Enable CookieJar
*
* @default false
*/
cookieJar?: boolean;
resources?: 'usable' | any;
}
interface BenchmarkUserOptions {
/**
* Include globs for benchmark test files
*
* @default ['**\/*.{bench,benchmark}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}']
*/
include?: string[];
/**
* Exclude globs for benchmark test files
* @default ['node_modules', 'dist', '.idea', '.git', '.cache']
*/
exclude?: string[];
/**
* Include globs for in-source benchmark test files
*
* @default []
*/
includeSource?: string[];
/**
* Custom reporter for output. Can contain one or more built-in report names, reporter instances,
* and/or paths to custom reporters
*/
reporters?: Arrayable$1<BenchmarkBuiltinReporters | Reporter>;
/**
* Write test results to a file when the `--reporter=json` option is also specified.
* Also definable individually per reporter by using an object instead.
*/
outputFile?: string | (Partial<Record<BenchmarkBuiltinReporters, string>> & Record<string, string>);
}
interface Benchmark extends TaskCustom {
meta: {
benchmark: true;
task?: Task$2;
result?: TaskResult;
};
}
interface BenchmarkResult extends TaskResult {
name: string;
rank: number;
}
type BenchFunction = (this: Bench) => Promise<void> | void;
type BenchmarkAPI = ChainableFunction<'skip' | 'only' | 'todo', [
name: string,
fn?: BenchFunction,
options?: Options
], void> & {
skipIf(condition: any): BenchmarkAPI;
runIf(condition: any): BenchmarkAPI;
};
type BuiltinEnvironment = 'node' | 'jsdom' | 'happy-dom' | 'edge-runtime';
type VitestEnvironment = BuiltinEnvironment | (string & Record<never, never>);
type VitestPool = 'browser' | 'threads' | 'child_process';
type CSSModuleScopeStrategy = 'stable' | 'scoped' | 'non-scoped';
type ApiConfig = Pick<CommonServerOptions, 'port' | 'strictPort' | 'host'>;
interface EnvironmentOptions {
/**
* jsdom options.
*/
jsdom?: JSDOMOptions;
[x: string]: unknown;
}
type VitestRunMode = 'test' | 'benchmark' | 'typecheck';
interface InlineConfig {
/**
* Name of the project. Will be used to display in the reporter.
*/
name?: string;
/**
* Benchmark options.
*
* @default {}
*/
benchmark?: BenchmarkUserOptions;
/**
* Include globs for test files
*
* @default ['**\/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}']
*/
include?: string[];
/**
* Exclude globs for test files
* @default ['node_modules', 'dist', '.idea', '.git', '.cache']
*/
exclude?: string[];
/**
* Include globs for in-source test files
*
* @default []
*/
includeSource?: string[];
/**
* Handling for dependencies inlining or externalizing
*/
deps?: {
/**
* Enable dependency optimization. This can improve the performance of your tests.
*/
experimentalOptimizer?: Omit<DepOptimizationConfig, 'disabled'> & {
enabled: boolean;
};
/**
* Externalize means that Vite will bypass the package to native Node.
*
* Externalized dependencies will not be applied Vite's transformers and resolvers.
* And does not support HMR on reload.
*
* Typically, packages under `node_modules` are externalized.
*/
external?: (string | RegExp)[];
/**
* Vite will process inlined modules.
*
* This could be helpful to handle packages that ship `.js` in ESM format (that Node can't handle).
*
* If `true`, every dependency will be inlined
*/
inline?: (string | RegExp)[] | true;
/**
* Interpret CJS module's default as named exports
*
* @default true
*/
interopDefault?: boolean;
/**
* When a dependency is a valid ESM package, try to guess the cjs version based on the path.
* This will significantly improve the performance in huge repo, but might potentially
* cause some misalignment if a package have different logic in ESM and CJS mode.
*
* @default false
*/
fallbackCJS?: boolean;
/**
* Use experimental Node loader to resolve imports inside node_modules using Vite resolve algorithm.
* @default false
*/
registerNodeLoader?: boolean;
};
/**
* Base directory to scan for the test files
*
* @default `config.root`
*/
dir?: string;
/**
* Register apis globally
*
* @default false
*/
globals?: boolean;
/**
* Running environment
*
* Supports 'node', 'jsdom', 'happy-dom', 'edge-runtime'
*
* If used unsupported string, will try to load the package `vitest-environment-${env}`
*
* @default 'node'
*/
environment?: VitestEnvironment;
/**
* Environment options.
*/
environmentOptions?: EnvironmentOptions;
/**
* Automatically assign environment based on globs. The first match will be used.
*
* Format: [glob, environment-name]
*
* @default []
* @example [
* // all tests in tests/dom will run in jsdom
* ['tests/dom/**', 'jsdom'],
* // all tests in tests/ with .edge.test.ts will run in edge-runtime
* ['**\/*.edge.test.ts', 'edge-runtime'],
* // ...
* ]
*/
environmentMatchGlobs?: [string, VitestEnvironment][];
/**
* Automatically assign pool based on globs. The first match will be used.
*
* Format: [glob, pool-name]
*
* @default []
* @example [
* // all tests in "browser" directory will run in an actual browser
* ['tests/browser/**', 'browser'],
* // all other tests will run based on "threads" option, if you didn't specify other globs
* // ...
* ]
*/
poolMatchGlobs?: [string, VitestPool][];
/**
* Update snapshot
*
* @default false
*/
update?: boolean;
/**
* Watch mode
*
* @default true
*/
watch?: boolean;
/**
* Project root
*
* @default process.cwd()
*/
root?: string;
/**
* Custom reporter for output. Can contain one or more built-in report names, reporter instances,
* and/or paths to custom reporters.
*/
reporters?: Arrayable<BuiltinReporters | 'html' | Reporter | Omit<string, BuiltinReporters>>;
/**