From 5e368daeecb85721069b4a82fa0f592b6a1af879 Mon Sep 17 00:00:00 2001 From: Chris Heyer Date: Thu, 16 May 2024 22:25:15 +0000 Subject: [PATCH 1/2] Add types for render function --- package.json | 2 ++ types/index.d.ts | 29 +++++++++++++++++++++-------- types/index.test-d.ts | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 3c2760a..a3b7b08 100644 --- a/package.json +++ b/package.json @@ -68,9 +68,11 @@ "lodash.merge": "^4.6.2", "msw": "^1.3.2", "tsd": "^0.29.0", + "type-fest": "~2.19", "typescript": "^5.2.2", "vee-validate": "^4.11.8", "vue": "^3.3.5", + "vue-component-type-helpers": "^2.0.19", "vue-eslint-parser": "^9.3.2", "vue-i18n": "^9.5.0", "vue-router": "^4.2.5", diff --git a/types/index.d.ts b/types/index.d.ts index c6c157d..8840bc4 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,10 +1,13 @@ // Minimum TypeScript Version: 4.0 /* eslint-disable @typescript-eslint/no-explicit-any */ -import {MountingOptions} from '@vue/test-utils' -import {queries, EventType, BoundFunctions} from '@testing-library/dom' +import { VNodeChild } from 'vue'; +import { MountingOptions } from '@vue/test-utils' +import { queries, EventType, BoundFunctions } from '@testing-library/dom' // eslint-disable-next-line import/no-extraneous-dependencies -import {OptionsReceived as PrettyFormatOptions} from 'pretty-format' +import { OptionsReceived as PrettyFormatOptions } from 'pretty-format' +import type { ComponentProps, ComponentSlots } from "vue-component-type-helpers"; +import { RemoveIndexSignature } from "type-fest"; // NOTE: fireEvent is overridden below export * from '@testing-library/dom' @@ -44,12 +47,22 @@ interface VueTestingLibraryRenderOptions { container?: Element baseElement?: Element } -export type RenderOptions = VueTestingLibraryRenderOptions & - VueTestUtilsRenderOptions -export function render( - TestComponent: any, // this makes me sad :sob: - options?: RenderOptions, + +type AllowNonFunctionSlots = { + [K in keyof Slots]: Slots[K] | VNodeChild; +}; +type ExtractSlots = AllowNonFunctionSlots>>>; + +export interface RenderOptions extends Omit { + props?: ComponentProps; + slots?: ExtractSlots; +} + +export function render( + TestComponent: C, + options?: RenderOptions, ): RenderResult export type AsyncFireObject = { diff --git a/types/index.test-d.ts b/types/index.test-d.ts index 5a0253d..02e9e18 100644 --- a/types/index.test-d.ts +++ b/types/index.test-d.ts @@ -68,7 +68,7 @@ export async function testWaitFor() { export function testOptions() { render(SomeComponent, { attrs: {a: 1}, - props: {c: 1}, // ideally it would fail because `c` is not an existing prop… + props: {foo: 1}, data: () => ({b: 2}), slots: { default: '
', From a954edb934de5a1fcf58d8d34f55a614a91b0149 Mon Sep 17 00:00:00 2001 From: Chris Heyer Date: Sat, 18 May 2024 08:04:30 +0000 Subject: [PATCH 2/2] Fix lint errors --- src/__tests__/render.js | 2 +- types/index.d.ts | 32 ++++++++++++++++++-------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/__tests__/render.js b/src/__tests__/render.js index ea55817..235210e 100644 --- a/src/__tests__/render.js +++ b/src/__tests__/render.js @@ -1,6 +1,6 @@ -import {render, cleanup} from '..' import {h, defineComponent} from 'vue' import '@testing-library/jest-dom' +import {render, cleanup} from '..' test('baseElement defaults to document.body', () => { const {baseElement} = render({template: '
'}) diff --git a/types/index.d.ts b/types/index.d.ts index 8840bc4..d4edc3b 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,13 +1,13 @@ // Minimum TypeScript Version: 4.0 /* eslint-disable @typescript-eslint/no-explicit-any */ -import { VNodeChild } from 'vue'; -import { MountingOptions } from '@vue/test-utils' -import { queries, EventType, BoundFunctions } from '@testing-library/dom' +import {VNodeChild} from 'vue' +import {MountingOptions} from '@vue/test-utils' +import {queries, EventType, BoundFunctions} from '@testing-library/dom' // eslint-disable-next-line import/no-extraneous-dependencies -import { OptionsReceived as PrettyFormatOptions } from 'pretty-format' -import type { ComponentProps, ComponentSlots } from "vue-component-type-helpers"; -import { RemoveIndexSignature } from "type-fest"; +import {OptionsReceived as PrettyFormatOptions} from 'pretty-format' +import {ComponentProps, ComponentSlots} from 'vue-component-type-helpers' +import {RemoveIndexSignature} from 'type-fest' // NOTE: fireEvent is overridden below export * from '@testing-library/dom' @@ -48,16 +48,20 @@ interface VueTestingLibraryRenderOptions { baseElement?: Element } - type AllowNonFunctionSlots = { - [K in keyof Slots]: Slots[K] | VNodeChild; -}; -type ExtractSlots = AllowNonFunctionSlots>>>; + [K in keyof Slots]: Slots[K] | VNodeChild +} +type ExtractSlots = AllowNonFunctionSlots< + Partial>> +> -export interface RenderOptions extends Omit { - props?: ComponentProps; - slots?: ExtractSlots; +export interface RenderOptions + extends Omit< + VueTestingLibraryRenderOptions & VueTestUtilsRenderOptions, + 'props' | 'slots' + > { + props?: ComponentProps + slots?: ExtractSlots } export function render(