[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

fix(vitest): improve vi.waitUntil type to excude falsy types (#4572)

authored by

Vladimir and committed by
GitHub
(Nov 22, 2023, 6:16 PM +0100) 23652300 0a14dd81

+20 -2
+16
test/typescript/test-d/vi.test-d.ts
··· 1 + import { expectTypeOf, test, vi } from 'vitest' 2 + 3 + test('vi.waitUntil correctly resolves return type', () => { 4 + expectTypeOf(vi.waitUntil(() => 'string')).resolves.toEqualTypeOf<string>() 5 + expectTypeOf(vi.waitUntil(() => 1)).resolves.toEqualTypeOf<number>() 6 + 7 + expectTypeOf(vi.waitUntil(() => false as const)).resolves.toEqualTypeOf<never>() 8 + expectTypeOf(vi.waitUntil(() => '' as const)).resolves.toEqualTypeOf<never>() 9 + expectTypeOf(vi.waitUntil(() => 0 as const)).resolves.toEqualTypeOf<never>() 10 + 11 + expectTypeOf(vi.waitUntil(() => '' as '' | number)).resolves.toEqualTypeOf<number>() 12 + expectTypeOf(vi.waitUntil(() => null as null | number)).resolves.toEqualTypeOf<number>() 13 + expectTypeOf(vi.waitUntil(() => undefined as undefined | number)).resolves.toEqualTypeOf<number>() 14 + expectTypeOf(vi.waitUntil(() => false as false | number)).resolves.toEqualTypeOf<number>() 15 + expectTypeOf(vi.waitUntil(() => 0 as 0 | string)).resolves.toEqualTypeOf<string>() 16 + })
+4 -2
packages/vitest/src/integrations/wait.ts
··· 100 100 101 101 export interface WaitUntilOptions extends Pick<WaitForOptions, 'interval' | 'timeout'> {} 102 102 103 + type Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T 104 + 103 105 export function waitUntil<T>(callback: WaitUntilCallback<T>, options: number | WaitUntilOptions = {}) { 104 106 const { setTimeout, setInterval, clearTimeout, clearInterval } = getSafeTimers() 105 107 const { interval = 50, timeout = 1000 } = typeof options === 'number' ? { timeout: options } : options 106 108 const STACK_TRACE_ERROR = new Error('STACK_TRACE_ERROR') 107 109 108 - return new Promise<T>((resolve, reject) => { 110 + return new Promise<Truthy<T>>((resolve, reject) => { 109 111 let promiseStatus: 'idle' | 'pending' | 'resolved' | 'rejected' = 'idle' 110 112 let timeoutId: ReturnType<typeof setTimeout> 111 113 let intervalId: ReturnType<typeof setInterval> ··· 125 127 if (intervalId) 126 128 clearInterval(intervalId) 127 129 128 - resolve(result) 130 + resolve(result as Truthy<T>) 129 131 return true 130 132 } 131 133