diff --git a/packages/coverage-istanbul/src/constants.ts b/packages/coverage-istanbul/src/constants.ts index 1f81d8ad9..a8ff606d2 100644 --- a/packages/coverage-istanbul/src/constants.ts +++ b/packages/coverage-istanbul/src/constants.ts @@ -1 +1 @@ -export const COVERAGE_STORE_KEY = '__VITEST_COVERAGE__' +export const COVERAGE_STORE_KEY: string = '__VITEST_COVERAGE__' diff --git a/packages/coverage-istanbul/src/index.ts b/packages/coverage-istanbul/src/index.ts index f20c95582..b02518138 100644 --- a/packages/coverage-istanbul/src/index.ts +++ b/packages/coverage-istanbul/src/index.ts @@ -1,6 +1,7 @@ import { COVERAGE_STORE_KEY } from './constants' +import type { IstanbulCoverageProvider } from './provider' -export async function getProvider() { +export async function getProvider(): Promise { // to not bundle the provider const providerPath = './provider.js' const { IstanbulCoverageProvider } = (await import( @@ -10,7 +11,7 @@ export async function getProvider() { return new IstanbulCoverageProvider() } -export function takeCoverage() { +export function takeCoverage(): any { // @ts-expect-error -- untyped global const coverage = globalThis[COVERAGE_STORE_KEY] @@ -21,7 +22,12 @@ export function takeCoverage() { return coverage } -export default { +const _default: { + getProvider: () => Promise + takeCoverage: () => any +} = { getProvider, takeCoverage, } + +export default _default diff --git a/packages/coverage-istanbul/src/provider.ts b/packages/coverage-istanbul/src/provider.ts index ae909f519..8597ef200 100644 --- a/packages/coverage-istanbul/src/provider.ts +++ b/packages/coverage-istanbul/src/provider.ts @@ -57,13 +57,11 @@ interface TestExclude { } } -const DEFAULT_PROJECT = Symbol.for('default-project') +const DEFAULT_PROJECT: unique symbol = Symbol.for('default-project') const debug = createDebug('vitest:coverage') let uniqueId = 0 -export class IstanbulCoverageProvider - extends BaseCoverageProvider - implements CoverageProvider { +export class IstanbulCoverageProvider extends BaseCoverageProvider implements CoverageProvider { name = 'istanbul' ctx!: Vitest @@ -71,11 +69,11 @@ export class IstanbulCoverageProvider instrumenter!: Instrumenter testExclude!: InstanceType - coverageFiles = new Map() + coverageFiles: Map = new Map() coverageFilesDirectory!: string pendingPromises: Promise[] = [] - initialize(ctx: Vitest) { + initialize(ctx: Vitest): void { const config: CoverageIstanbulOptions = ctx.config.coverage this.ctx = ctx @@ -145,11 +143,14 @@ export class IstanbulCoverageProvider ) } - resolveOptions() { + resolveOptions(): Options { return this.options } - onFileTransform(sourceCode: string, id: string, pluginCtx: any) { + onFileTransform(sourceCode: string, id: string, pluginCtx: any): { + code: string + map: any + } | undefined { if (!this.testExclude.shouldInstrument(id)) { return } @@ -178,7 +179,7 @@ export class IstanbulCoverageProvider * Note that adding new entries here and requiring on those without * backwards compatibility is a breaking change. */ - onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta) { + onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta): void { if (!coverage) { return } @@ -204,7 +205,7 @@ export class IstanbulCoverageProvider this.pendingPromises.push(promise) } - async clean(clean = true) { + async clean(clean = true): Promise { if (clean && existsSync(this.options.reportsDirectory)) { await fs.rm(this.options.reportsDirectory, { recursive: true, @@ -227,7 +228,7 @@ export class IstanbulCoverageProvider this.pendingPromises = [] } - async generateCoverage({ allTestsRun }: ReportContext) { + async generateCoverage({ allTestsRun }: ReportContext): Promise { const coverageMap = libCoverage.createCoverageMap({}) let index = 0 const total = this.pendingPromises.length @@ -282,7 +283,7 @@ export class IstanbulCoverageProvider return coverageMap } - async reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext) { + async reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext): Promise { await this.generateReports( (coverageMap as CoverageMap) || libCoverage.createCoverageMap({}), allTestsRun, @@ -305,7 +306,7 @@ export class IstanbulCoverageProvider async generateReports( coverageMap: CoverageMap, allTestsRun: boolean | undefined, - ) { + ): Promise { const context = libReport.createContext({ dir: this.options.reportsDirectory, coverageMap, @@ -370,7 +371,7 @@ export class IstanbulCoverageProvider } } - async mergeReports(coverageMaps: unknown[]) { + async mergeReports(coverageMaps: unknown[]): Promise { const coverageMap = libCoverage.createCoverageMap({}) for (const coverage of coverageMaps) { diff --git a/packages/coverage-istanbul/tsconfig.json b/packages/coverage-istanbul/tsconfig.json index 8bcb003f8..73cb13106 100644 --- a/packages/coverage-istanbul/tsconfig.json +++ b/packages/coverage-istanbul/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler" + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] } diff --git a/packages/coverage-v8/src/index.ts b/packages/coverage-v8/src/index.ts index c7a0ee47a..fb03b3b8b 100644 --- a/packages/coverage-v8/src/index.ts +++ b/packages/coverage-v8/src/index.ts @@ -1,8 +1,18 @@ +import type { Profiler } from 'node:inspector' import * as coverage from './takeCoverage' +import type { V8CoverageProvider } from './provider' export default { - ...coverage, - async getProvider() { + startCoverage(): void { + return coverage.startCoverage() + }, + takeCoverage(): Promise<{ result: Profiler.ScriptCoverage[] }> { + return coverage.takeCoverage() + }, + stopCoverage(): void { + return coverage.stopCoverage() + }, + async getProvider(): Promise { // to not bundle the provider const name = './provider.js' const { V8CoverageProvider } = (await import( diff --git a/packages/coverage-v8/src/provider.ts b/packages/coverage-v8/src/provider.ts index aa01dced6..8b032e72a 100644 --- a/packages/coverage-v8/src/provider.ts +++ b/packages/coverage-v8/src/provider.ts @@ -73,25 +73,23 @@ const VITE_EXPORTS_LINE_PATTERN = /Object\.defineProperty\(__vite_ssr_exports__.*\n/g const DECORATOR_METADATA_PATTERN = /_ts_metadata\("design:paramtypes", \[[^\]]*\]\),*/g -const DEFAULT_PROJECT = Symbol.for('default-project') +const DEFAULT_PROJECT: unique symbol = Symbol.for('default-project') const debug = createDebug('vitest:coverage') let uniqueId = 0 -export class V8CoverageProvider - extends BaseCoverageProvider - implements CoverageProvider { +export class V8CoverageProvider extends BaseCoverageProvider implements CoverageProvider { name = 'v8' ctx!: Vitest options!: Options testExclude!: InstanceType - coverageFiles = new Map() + coverageFiles: Map = new Map() coverageFilesDirectory!: string pendingPromises: Promise[] = [] - initialize(ctx: Vitest) { + initialize(ctx: Vitest): void { const config: CoverageV8Options = ctx.config.coverage this.ctx = ctx @@ -142,11 +140,11 @@ export class V8CoverageProvider ) } - resolveOptions() { + resolveOptions(): Options { return this.options } - async clean(clean = true) { + async clean(clean = true): Promise { if (clean && existsSync(this.options.reportsDirectory)) { await fs.rm(this.options.reportsDirectory, { recursive: true, @@ -174,7 +172,7 @@ export class V8CoverageProvider * Note that adding new entries here and requiring on those without * backwards compatibility is a breaking change. */ - onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta) { + onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta): void { if (transformMode !== 'web' && transformMode !== 'ssr') { throw new Error(`Invalid transform mode: ${transformMode}`) } @@ -196,7 +194,7 @@ export class V8CoverageProvider this.pendingPromises.push(promise) } - async generateCoverage({ allTestsRun }: ReportContext) { + async generateCoverage({ allTestsRun }: ReportContext): Promise { const coverageMap = libCoverage.createCoverageMap({}) let index = 0 const total = this.pendingPromises.length @@ -255,7 +253,7 @@ export class V8CoverageProvider return coverageMap } - async reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext) { + async reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext): Promise { if (provider === 'stackblitz') { this.ctx.logger.log( c.blue(' % ') @@ -284,7 +282,7 @@ export class V8CoverageProvider } } - async generateReports(coverageMap: CoverageMap, allTestsRun?: boolean) { + async generateReports(coverageMap: CoverageMap, allTestsRun?: boolean): Promise { const context = libReport.createContext({ dir: this.options.reportsDirectory, coverageMap, @@ -349,7 +347,7 @@ export class V8CoverageProvider } } - async mergeReports(coverageMaps: unknown[]) { + async mergeReports(coverageMaps: unknown[]): Promise { const coverageMap = libCoverage.createCoverageMap({}) for (const coverage of coverageMaps) { diff --git a/packages/coverage-v8/src/takeCoverage.ts b/packages/coverage-v8/src/takeCoverage.ts index 0172ff0d8..4ffabbd93 100644 --- a/packages/coverage-v8/src/takeCoverage.ts +++ b/packages/coverage-v8/src/takeCoverage.ts @@ -8,7 +8,7 @@ import { provider } from 'std-env' const session = new inspector.Session() -export function startCoverage() { +export function startCoverage(): void { session.connect() session.post('Profiler.enable') session.post('Profiler.startPreciseCoverage', { @@ -17,7 +17,7 @@ export function startCoverage() { }) } -export async function takeCoverage() { +export async function takeCoverage(): Promise<{ result: Profiler.ScriptCoverage[] }> { return new Promise((resolve, reject) => { session.post('Profiler.takePreciseCoverage', async (error, coverage) => { if (error) { @@ -36,7 +36,7 @@ export async function takeCoverage() { }) } -export function stopCoverage() { +export function stopCoverage(): void { session.post('Profiler.stopPreciseCoverage') session.post('Profiler.disable') session.disconnect() diff --git a/packages/coverage-v8/tsconfig.json b/packages/coverage-v8/tsconfig.json index 8bcb003f8..73cb13106 100644 --- a/packages/coverage-v8/tsconfig.json +++ b/packages/coverage-v8/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler" + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] } diff --git a/packages/snapshot/src/client.ts b/packages/snapshot/src/client.ts index dcbdff37b..4faf6802a 100644 --- a/packages/snapshot/src/client.ts +++ b/packages/snapshot/src/client.ts @@ -1,6 +1,6 @@ import { deepMergeSnapshot } from './port/utils' import SnapshotState from './port/state' -import type { SnapshotStateOptions } from './types' +import type { SnapshotResult, SnapshotStateOptions } from './types' import type { RawSnapshotInfo } from './port/rawSnapshot' function createMismatchError( @@ -53,7 +53,7 @@ export class SnapshotClient { filepath?: string name?: string snapshotState: SnapshotState | undefined - snapshotStateMap = new Map() + snapshotStateMap: Map = new Map() constructor(private options: SnapshotClientOptions = {}) {} @@ -61,7 +61,7 @@ export class SnapshotClient { filepath: string, name: string, options: SnapshotStateOptions, - ) { + ): Promise { this.filepath = filepath this.name = name @@ -78,16 +78,16 @@ export class SnapshotClient { } } - getSnapshotState(filepath: string) { + getSnapshotState(filepath: string): SnapshotState { return this.snapshotStateMap.get(filepath)! } - clearTest() { + clearTest(): void { this.filepath = undefined this.name = undefined } - skipTestSnapshots(name: string) { + skipTestSnapshots(name: string): void { this.snapshotState?.markSnapshotsAsCheckedForTest(name) } @@ -189,7 +189,7 @@ export class SnapshotClient { return this.assert(options) } - async finishCurrentRun() { + async finishCurrentRun(): Promise { if (!this.snapshotState) { return null } @@ -199,7 +199,7 @@ export class SnapshotClient { return result } - clear() { + clear(): void { this.snapshotStateMap.clear() } } diff --git a/packages/snapshot/src/env/node.ts b/packages/snapshot/src/env/node.ts index 32a61795d..4463e23fb 100644 --- a/packages/snapshot/src/env/node.ts +++ b/packages/snapshot/src/env/node.ts @@ -13,7 +13,7 @@ export class NodeSnapshotEnvironment implements SnapshotEnvironment { return `// Snapshot v${this.getVersion()}` } - async resolveRawPath(testPath: string, rawPath: string) { + async resolveRawPath(testPath: string, rawPath: string): Promise { return isAbsolute(rawPath) ? rawPath : resolve(dirname(testPath), rawPath) } diff --git a/packages/snapshot/src/manager.ts b/packages/snapshot/src/manager.ts index 16c1f0fe9..44c88aaca 100644 --- a/packages/snapshot/src/manager.ts +++ b/packages/snapshot/src/manager.ts @@ -15,18 +15,17 @@ export class SnapshotManager { this.clear() } - clear() { + clear(): void { this.summary = emptySummary(this.options) } - add(result: SnapshotResult) { + add(result: SnapshotResult): void { addSnapshotResult(this.summary, result) } - resolvePath(testPath: string) { + resolvePath(testPath: string): string { const resolver - = this.options.resolveSnapshotPath - || (() => { + = this.options.resolveSnapshotPath || (() => { return join( join(dirname(testPath), '__snapshots__'), `${basename(testPath)}${this.extension}`, @@ -37,7 +36,7 @@ export class SnapshotManager { return path } - resolveRawPath(testPath: string, rawPath: string) { + resolveRawPath(testPath: string, rawPath: string): string { return isAbsolute(rawPath) ? rawPath : resolve(dirname(testPath), rawPath) } } diff --git a/packages/snapshot/src/port/inlineSnapshot.ts b/packages/snapshot/src/port/inlineSnapshot.ts index af69121b5..11487738e 100644 --- a/packages/snapshot/src/port/inlineSnapshot.ts +++ b/packages/snapshot/src/port/inlineSnapshot.ts @@ -17,7 +17,7 @@ export interface InlineSnapshot { export async function saveInlineSnapshots( environment: SnapshotEnvironment, snapshots: Array, -) { +): Promise { const MagicString = (await import('magic-string')).default const files = new Set(snapshots.map(i => i.file)) await Promise.all( @@ -148,7 +148,7 @@ export function replaceInlineSnap( s: MagicString, currentIndex: number, newSnap: string, -) { +): boolean { const { code: codeStartingAtIndex, index } = getCodeStartingAtIndex(code, currentIndex) const startMatch = startRegex.exec(codeStartingAtIndex) @@ -182,7 +182,7 @@ export function replaceInlineSnap( } const INDENTATION_REGEX = /^([^\S\n]*)\S/m -export function stripSnapshotIndentation(inlineSnapshot: string) { +export function stripSnapshotIndentation(inlineSnapshot: string): string { // Find indentation if exists. const match = inlineSnapshot.match(INDENTATION_REGEX) if (!match || !match[1]) { diff --git a/packages/snapshot/src/port/rawSnapshot.ts b/packages/snapshot/src/port/rawSnapshot.ts index f544c5532..c7d445bcc 100644 --- a/packages/snapshot/src/port/rawSnapshot.ts +++ b/packages/snapshot/src/port/rawSnapshot.ts @@ -14,7 +14,7 @@ export interface RawSnapshot extends RawSnapshotInfo { export async function saveRawSnapshots( environment: SnapshotEnvironment, snapshots: Array, -) { +): Promise { await Promise.all( snapshots.map(async (snap) => { if (!snap.readonly) { diff --git a/packages/snapshot/src/port/state.ts b/packages/snapshot/src/port/state.ts index 0f47b4e5a..eab28e81e 100644 --- a/packages/snapshot/src/port/state.ts +++ b/packages/snapshot/src/port/state.ts @@ -94,7 +94,7 @@ export default class SnapshotState { this._environment = options.snapshotEnvironment } - static async create(testFilePath: string, options: SnapshotStateOptions) { + static async create(testFilePath: string, options: SnapshotStateOptions): Promise { const snapshotPath = await options.snapshotEnvironment.resolvePath( testFilePath, ) @@ -104,7 +104,7 @@ export default class SnapshotState { return new SnapshotState(testFilePath, snapshotPath, content, options) } - get environment() { + get environment(): SnapshotEnvironment { return this._environment } @@ -116,7 +116,7 @@ export default class SnapshotState { }) } - protected _inferInlineSnapshotStack(stacks: ParsedStack[]) { + protected _inferInlineSnapshotStack(stacks: ParsedStack[]): ParsedStack | null { // if called inside resolves/rejects, stacktrace is different const promiseIndex = stacks.findIndex(i => i.method.match(/__VITEST_(RESOLVES|REJECTS)__/), diff --git a/packages/snapshot/src/port/utils.ts b/packages/snapshot/src/port/utils.ts index d247616f2..35b31dfd1 100644 --- a/packages/snapshot/src/port/utils.ts +++ b/packages/snapshot/src/port/utils.ts @@ -131,7 +131,7 @@ function printBacktickString(str: string): string { return `\`${escapeBacktickString(str)}\`` } -export function normalizeNewlines(string: string) { +export function normalizeNewlines(string: string): string { return string.replace(/\r\n|\r/g, '\n') } @@ -139,7 +139,7 @@ export async function saveSnapshotFile( environment: SnapshotEnvironment, snapshotData: SnapshotData, snapshotPath: string, -) { +): Promise { const snapshots = Object.keys(snapshotData) .sort(naturalCompare) .map( @@ -164,7 +164,7 @@ export async function saveSnapshotFileRaw( environment: SnapshotEnvironment, content: string, snapshotPath: string, -) { +): Promise { const oldContent = await environment.readSnapshotFile(snapshotPath) const skipWriting = oldContent != null && oldContent === content @@ -175,7 +175,7 @@ export async function saveSnapshotFileRaw( await environment.saveSnapshotFile(snapshotPath, content) } -export function prepareExpected(expected?: string) { +export function prepareExpected(expected?: string): string | undefined { function findStartIndent() { // Attempts to find indentation for objects. // Matches the ending tag of the object. diff --git a/packages/snapshot/tsconfig.json b/packages/snapshot/tsconfig.json index 8bcb003f8..93e30d6aa 100644 --- a/packages/snapshot/tsconfig.json +++ b/packages/snapshot/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler", + "isolatedDeclarations": true + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] } diff --git a/packages/spy/src/index.ts b/packages/spy/src/index.ts index 9e698adf8..6ce989bf6 100644 --- a/packages/spy/src/index.ts +++ b/packages/spy/src/index.ts @@ -380,7 +380,7 @@ export type Mocked = { : T[P]; } & T -export const mocks = new Set() +export const mocks: Set = new Set() export function isMockFunction(fn: any): fn is MockInstance { return ( diff --git a/packages/spy/tsconfig.json b/packages/spy/tsconfig.json index 8bcb003f8..93e30d6aa 100644 --- a/packages/spy/tsconfig.json +++ b/packages/spy/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler", + "isolatedDeclarations": true + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] }