Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d46ed8f

Browse files
authored
feat: Add types for props and slots in render function
* Add types for render function * Fix lint errors
1 parent 3ecde9e commit d46ed8f

File tree

4 files changed

+26
-7
lines changed

4 files changed

+26
-7
lines changed

‎package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@
6868
"lodash.merge": "^4.6.2",
6969
"msw": "^1.3.2",
7070
"tsd": "^0.29.0",
71+
"type-fest": "~2.19",
7172
"typescript": "^5.2.2",
7273
"vee-validate": "^4.11.8",
7374
"vue": "^3.3.5",
75+
"vue-component-type-helpers": "^2.0.19",
7476
"vue-eslint-parser": "^9.3.2",
7577
"vue-i18n": "^9.5.0",
7678
"vue-router": "^4.2.5",

‎src/__tests__/render.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import {render, cleanup} from '..'
21
import {h, defineComponent} from 'vue'
32
import '@testing-library/jest-dom'
3+
import {render, cleanup} from '..'
44

55
test('baseElement defaults to document.body', () => {
66
const {baseElement} = render({template: '<div />'})

‎types/index.d.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
// Minimum TypeScript Version: 4.0
22
/* eslint-disable @typescript-eslint/no-explicit-any */
33

4+
import {VNodeChild} from 'vue'
45
import {MountingOptions} from '@vue/test-utils'
56
import {queries, EventType, BoundFunctions} from '@testing-library/dom'
67
// eslint-disable-next-line import/no-extraneous-dependencies
78
import {OptionsReceived as PrettyFormatOptions} from 'pretty-format'
9+
import {ComponentProps, ComponentSlots} from 'vue-component-type-helpers'
10+
import {RemoveIndexSignature} from 'type-fest'
811

912
// NOTE: fireEvent is overridden below
1013
export * from '@testing-library/dom'
@@ -44,12 +47,26 @@ interface VueTestingLibraryRenderOptions {
4447
container?: Element
4548
baseElement?: Element
4649
}
47-
export type RenderOptions = VueTestingLibraryRenderOptions &
48-
VueTestUtilsRenderOptions
4950

50-
export function render(
51-
TestComponent: any, // this makes me sad :sob:
52-
options?: RenderOptions,
51+
type AllowNonFunctionSlots<Slots> = {
52+
[K in keyof Slots]: Slots[K] | VNodeChild
53+
}
54+
type ExtractSlots<C> = AllowNonFunctionSlots<
55+
Partial<RemoveIndexSignature<ComponentSlots<C>>>
56+
>
57+
58+
export interface RenderOptions<C>
59+
extends Omit<
60+
VueTestingLibraryRenderOptions & VueTestUtilsRenderOptions,
61+
'props' | 'slots'
62+
> {
63+
props?: ComponentProps<C>
64+
slots?: ExtractSlots<C>
65+
}
66+
67+
export function render<C>(
68+
TestComponent: C,
69+
options?: RenderOptions<C>,
5370
): RenderResult
5471

5572
export type AsyncFireObject = {

‎types/index.test-d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export async function testWaitFor() {
6868
export function testOptions() {
6969
render(SomeComponent, {
7070
attrs: {a: 1},
71-
props: {c: 1},// ideally it would fail because `c` is not an existing prop...
71+
props: {foo: 1},
7272
data: () => ({b: 2}),
7373
slots: {
7474
default: '<div />',

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /