UNPKG

vitest

Version:

A blazing fast unit test framework powered by Vite

1,627 lines (1,531 loc) 71.5 kB
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>>; /**