From 42a556665316d82824b7306f6e7f5b021aed6b59 Mon Sep 17 00:00:00 2001 From: Jason Harwig Date: Wed, 5 May 2021 15:03:27 -0500 Subject: [PATCH] fix(types): fix waitForSelector typing to not union null when appropriate (#6344) Previously when options were defined, but no `state` key was provided, the types would return null as an option. Even though the default state is `visible` and shouldn't allow `null`. Tests updated to fail appropriately and new tests added for this case. --- types/types.d.ts | 4 ++-- utils/generate_types/overrides.d.ts | 4 ++-- utils/generate_types/test/test.ts | 27 +++++++++++++++++++-------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/types/types.d.ts b/types/types.d.ts index 51616743fb..540c2e7928 100644 --- a/types/types.d.ts +++ b/types/types.d.ts @@ -21,10 +21,10 @@ import { Readable } from 'stream'; import { Serializable, EvaluationArgument, PageFunction, PageFunctionOn, SmartHandle, ElementHandleForTag, BindingSource } from './structs'; type PageWaitForSelectorOptionsNotHidden = PageWaitForSelectorOptions & { - state: 'visible'|'attached'; + state?: 'visible'|'attached'; }; type ElementHandleWaitForSelectorOptionsNotHidden = ElementHandleWaitForSelectorOptions & { - state: 'visible'|'attached'; + state?: 'visible'|'attached'; }; /** diff --git a/utils/generate_types/overrides.d.ts b/utils/generate_types/overrides.d.ts index fa80db64a5..406b13d8db 100644 --- a/utils/generate_types/overrides.d.ts +++ b/utils/generate_types/overrides.d.ts @@ -20,10 +20,10 @@ import { Readable } from 'stream'; import { Serializable, EvaluationArgument, PageFunction, PageFunctionOn, SmartHandle, ElementHandleForTag, BindingSource } from './structs'; type PageWaitForSelectorOptionsNotHidden = PageWaitForSelectorOptions & { - state: 'visible'|'attached'; + state?: 'visible'|'attached'; }; type ElementHandleWaitForSelectorOptionsNotHidden = ElementHandleWaitForSelectorOptions & { - state: 'visible'|'attached'; + state?: 'visible'|'attached'; }; export interface Page { diff --git a/utils/generate_types/test/test.ts b/utils/generate_types/test/test.ts index 87249cbe6a..964456d923 100644 --- a/utils/generate_types/test/test.ts +++ b/utils/generate_types/test/test.ts @@ -675,47 +675,58 @@ playwright.chromium.launch().then(async browser => { } } + type AssertCanBeNull = null extends T ? true : false + const frameLikes = [page, frame]; for (const frameLike of frameLikes) { { const handle = await frameLike.waitForSelector('body'); + const bodyAssertion: AssertType, typeof handle> = true; + const canBeNull: AssertCanBeNull = false + } + { + const handle = await frameLike.waitForSelector('body', {timeout: 0}); const bodyAssertion: AssertType, typeof handle> = true; - const canBeNull: AssertType = false; + const canBeNull: AssertCanBeNull = false; } { const state = Math.random() > .5 ? 'attached' : 'visible'; const handle = await frameLike.waitForSelector('body', {state}); const bodyAssertion: AssertType, typeof handle> = true; - const canBeNull: AssertType = false; + const canBeNull: AssertCanBeNull = false; } { const handle = await frameLike.waitForSelector('body', {state: 'hidden'}); const bodyAssertion: AssertType, typeof handle> = true; - const canBeNull: AssertType = true; + const canBeNull: AssertCanBeNull = true; } { const state = Math.random() > .5 ? 'hidden' : 'visible'; const handle = await frameLike.waitForSelector('body', {state}); const bodyAssertion: AssertType, typeof handle> = true; - const canBeNull: AssertType = true; + const canBeNull: AssertCanBeNull = true; } - { const handle = await frameLike.waitForSelector('something-strange'); const elementAssertion: AssertType, typeof handle> = true; - const canBeNull: AssertType = false; + const canBeNull: AssertCanBeNull = false; } + { + const handle = await frameLike.waitForSelector('something-strange', {timeout: 0}); + const elementAssertion: AssertType, typeof handle> = true; + const canBeNull: AssertCanBeNull = false; + } { const state = Math.random() > .5 ? 'attached' : 'visible'; const handle = await frameLike.waitForSelector('something-strange', {state}); const elementAssertion: AssertType, typeof handle> = true; - const canBeNull: AssertType = false; + const canBeNull: AssertCanBeNull = false; } { const state = Math.random() > .5 ? 'hidden' : 'visible'; const handle = await frameLike.waitForSelector('something-strange', {state}); const elementAssertion: AssertType, typeof handle> = true; - const canBeNull: AssertType = true; + const canBeNull: AssertCanBeNull = true; } }