From 37fe25ea949a9ca59cca2df691120d22dbe048a0 Mon Sep 17 00:00:00 2001 From: pikax Date: Sat, 21 Nov 2020 08:58:52 +0000 Subject: [PATCH 1/3] fix(types): Fix mount and shallowMount types --- src/mount.ts | 7 +++---- test-dts/mount.d-test.ts | 23 +++++++++++++++++++++++ test-dts/shallowMount.d-test.ts | 22 ++++++++++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/mount.ts b/src/mount.ts index 4c51a5d17..ab7f01b76 100644 --- a/src/mount.ts +++ b/src/mount.ts @@ -38,7 +38,6 @@ import { attachEmitListener } from './emitMixin' import { createDataMixin } from './dataMixin' import { MOUNT_COMPONENT_REF, MOUNT_PARENT_NAME } from './constants' import { stubComponents } from './stubs' -import { VueConstructor } from 'vue-class-component' // NOTE this should come from `vue` type PublicProps = VNodeProps & AllowedComponentProps & ComponentCustomProps @@ -74,10 +73,10 @@ export type ObjectEmitsOptions = Record< export type EmitsOptions = ObjectEmitsOptions | string[] // Class component -export function mount( - originalComponent: VueConstructor, +export function mount( + originalComponent: new (...args: any[]) => V, options?: MountingOptions -): VueWrapper> +): VueWrapper> // Functional component with emits export function mount( diff --git a/test-dts/mount.d-test.ts b/test-dts/mount.d-test.ts index cb02e60b7..f00a792bb 100644 --- a/test-dts/mount.d-test.ts +++ b/test-dts/mount.d-test.ts @@ -5,6 +5,7 @@ import { FunctionalComponent, reactive } from 'vue' +import { Options, Vue } from 'vue-class-component' import { mount } from '../src' const AppWithDefine = defineComponent({ @@ -203,3 +204,25 @@ mount(FunctionalComponentEmit) // @ts-ignore vue 3.0.2 doesn't work. FIX: https://github.com/vuejs/vue-next/pull/2494 mount(defineComponent(FunctionalComponentEmit)) + +// class component + +@Options({ + props: { + msg: String + } +}) +class ClassComponent extends Vue { + dataText: string = '' + get computedMsg(): string { + return `Message: ${(this.$props as any).msg}` + } + + changeMessage(text: string): void { + this.dataText = 'Updated' + } +} + +// @ts-expect-error it requires an argument +expectError(mount(ClassComponent, {}).vm.changeMessage()) +mount(ClassComponent, {}).vm.changeMessage('') diff --git a/test-dts/shallowMount.d-test.ts b/test-dts/shallowMount.d-test.ts index 8887623ea..e077bcaec 100644 --- a/test-dts/shallowMount.d-test.ts +++ b/test-dts/shallowMount.d-test.ts @@ -1,5 +1,6 @@ import { expectError, expectType } from 'tsd' import { defineComponent } from 'vue' +import { Options, Vue } from 'vue-class-component' import { shallowMount } from '../src' const AppWithDefine = defineComponent({ @@ -99,3 +100,24 @@ expectError( shallowMount(AppWithoutProps, { props: { b: 'Hello' } as never }) + +// class component +@Options({ + props: { + msg: String + } +}) +class ClassComponent extends Vue { + dataText: string = '' + get computedMsg(): string { + return `Message: ${(this.$props as any).msg}` + } + + changeMessage(text: string): void { + this.dataText = 'Updated' + } +} + +// @ts-expect-error it requires an argument +expectError(mount(ClassComponent, {}).vm.changeMessage()) +shallowMount(ClassComponent, {}).vm.changeMessage('') From 798b58cb0690e9a71f95683ebad88fbb9ec78823 Mon Sep 17 00:00:00 2001 From: pikax Date: Sat, 21 Nov 2020 09:28:57 +0000 Subject: [PATCH 2/3] chore: improve class component overload and pass dts --- src/mount.ts | 10 ++++++---- test-dts/shallowMount.d-test.ts | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mount.ts b/src/mount.ts index ab7f01b76..84ddd68c2 100644 --- a/src/mount.ts +++ b/src/mount.ts @@ -27,7 +27,6 @@ import { import { config } from './config' import { GlobalMountOptions } from './types' import { - isClassComponent, isFunctionalComponent, isObjectComponent, mergeGlobalProperties @@ -73,9 +72,12 @@ export type ObjectEmitsOptions = Record< export type EmitsOptions = ObjectEmitsOptions | string[] // Class component -export function mount( - originalComponent: new (...args: any[]) => V, - options?: MountingOptions +export function mount( + originalComponent: { + new (...args: any[]): V + props(Props: P) + }, + options?: MountingOptions

): VueWrapper> // Functional component with emits diff --git a/test-dts/shallowMount.d-test.ts b/test-dts/shallowMount.d-test.ts index e077bcaec..9cfdd0f96 100644 --- a/test-dts/shallowMount.d-test.ts +++ b/test-dts/shallowMount.d-test.ts @@ -119,5 +119,5 @@ class ClassComponent extends Vue { } // @ts-expect-error it requires an argument -expectError(mount(ClassComponent, {}).vm.changeMessage()) +expectError(shallowMount(ClassComponent, {}).vm.changeMessage()) shallowMount(ClassComponent, {}).vm.changeMessage('') From 87eaaabeb587c8eeeef20fd479156e2d5a2b9251 Mon Sep 17 00:00:00 2001 From: pikax Date: Sat, 21 Nov 2020 09:37:43 +0000 Subject: [PATCH 3/3] chore: fix tests --- src/mount.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/mount.ts b/src/mount.ts index 84ddd68c2..e8de5395c 100644 --- a/src/mount.ts +++ b/src/mount.ts @@ -71,11 +71,21 @@ export type ObjectEmitsOptions = Record< > export type EmitsOptions = ObjectEmitsOptions | string[] -// Class component +// Class component - no props +export function mount( + originalComponent: { + new (...args: any[]): V + registerHooks(keys: string[]): void + }, + options?: MountingOptions +): VueWrapper> + +// Class component - props export function mount( originalComponent: { new (...args: any[]): V - props(Props: P) + props(Props: P): any + registerHooks(keys: string[]): void }, options?: MountingOptions

): VueWrapper>