diff --git a/package.json b/package.json index b30f05812..90fc52093 100644 --- a/package.json +++ b/package.json @@ -34,9 +34,9 @@ "@typescript-eslint/eslint-plugin": "^5.25.0", "@typescript-eslint/parser": "^5.25.0", "@vue/babel-plugin-jsx": "^1.1.1", - "@vue/compat": "3.2.33", - "@vue/compiler-dom": "3.2.33", - "@vue/compiler-sfc": "3.2.33", + "@vue/compat": "3.2.34", + "@vue/compiler-dom": "3.2.34", + "@vue/compiler-sfc": "3.2.34", "@vue/vue3-jest": "27.0.0-alpha.4", "babel-jest": "27.5.1", "babel-preset-jest": "28.0.2", @@ -57,7 +57,7 @@ "tslib": "2.4.0", "typescript": "4.6.4", "vitepress": "^0.22.4", - "vue": "3.2.33", + "vue": "3.2.34", "vue-class-component": "^8.0.0-rc.1", "vue-jest": "^5.0.0-alpha.10", "vue-router": "^4.0.15", diff --git a/src/baseWrapper.ts b/src/baseWrapper.ts index d23497cf3..0a1f0e462 100644 --- a/src/baseWrapper.ts +++ b/src/baseWrapper.ts @@ -2,8 +2,12 @@ import { textContent } from './utils' import type { TriggerOptions } from './createDomEvent' import { ComponentInternalInstance, + ComponentOptions, ComponentPublicInstance, + ComputedOptions, + CreateComponentPublicInstance, FunctionalComponent, + MethodOptions, nextTick } from 'vue' import { createDOMEvent } from './createDomEvent' @@ -99,6 +103,29 @@ export default abstract class BaseWrapper // searching by string without specifying component results in WrapperLike object findComponent(selector: string): WrapperLike + // Find Component Options aka plain object + findComponent< + Props, + RawBindings = any, + D = any, + C extends ComputedOptions = ComputedOptions, + M extends MethodOptions = MethodOptions + >( + selector: ComponentOptions + ): VueWrapper> + findComponent( + selector: string + ): VueWrapper< + T extends ComponentOptions< + infer Props, + infer RawBindings, + infer D, + infer C, + infer M + > + ? CreateComponentPublicInstance + : VueWrapper + > // searching for component created via defineComponent results in VueWrapper of proper type findComponent( selector: T | Exclude diff --git a/src/mount.ts b/src/mount.ts index 483c8b2c7..d7d7b6913 100644 --- a/src/mount.ts +++ b/src/mount.ts @@ -20,6 +20,7 @@ import { EmitsOptions, ComputedOptions, ComponentPropsOptions, + ComponentProvideOptions, ComponentOptions, ConcreteComponent, Prop @@ -129,6 +130,8 @@ export function mount< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = Record, EE extends string = string, + Provide extends ComponentProvideOptions = ComponentProvideOptions, + RawOptions extends {} = {}, PP = PublicProps, Props = Readonly>, Defaults = ExtractDefaultPropTypes @@ -143,6 +146,8 @@ export function mount< Extends, E, EE, + Provide, + RawOptions, PP, Props, Defaults @@ -164,6 +169,8 @@ export function mount< Extends, E, EE, + Provide, + RawOptions, PP, Props, Defaults @@ -273,7 +280,7 @@ export function mount( inputComponent: any, options?: MountingOptions & Record ): VueWrapper { - // normalise the incoming component + // normalize the incoming component const originalComponent = unwrapLegacyVueExtendComponent(inputComponent) let component: ConcreteComponent const instanceOptions = getInstanceOptions(options ?? {}) diff --git a/src/types.ts b/src/types.ts index ee15cd0f4..4bda84b1c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -21,6 +21,7 @@ export interface NameSelector { export type FindAllComponentsSelector = | DefinedComponent | FunctionalComponent + | ComponentOptions | NameSelector | string export type FindComponentSelector = RefSelector | FindAllComponentsSelector diff --git a/test-dts/mount.d-test.ts b/test-dts/mount.d-test.ts index b753fafc4..dd412a6d3 100644 --- a/test-dts/mount.d-test.ts +++ b/test-dts/mount.d-test.ts @@ -56,8 +56,8 @@ mount(AppWithDefine, { }) expectError( - // @ts-expect-error wrong prop type should not compile mount(AppWithDefine, { + // @ts-expect-error wrong prop type should not compile props: { a: 2 } }) ) @@ -186,14 +186,12 @@ declare const FunctionalComponentEmit: FunctionalComponent< level: number }, { hello: (foo: string, bar: string) => void } - > +> mount(FunctionalComponent) mount(defineComponent(FunctionalComponent)) 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 @@ -204,7 +202,7 @@ mount(defineComponent(FunctionalComponentEmit)) } }) class ClassComponent extends Vue { - dataText: string = '' + dataText = '' get computedMsg(): string { return `Message: ${(this.$props as any).msg}` } @@ -224,6 +222,7 @@ class CustomClassComponent { private static __vccValue?: ComponentOptions static get __vccOpts(): ComponentOptions { if (this.__vccValue) return this.__vccValue + // eslint-disable-next-line @typescript-eslint/no-this-alias const CompConstructor = this return (this.__vccValue = { name: CompConstructor.name, @@ -279,14 +278,20 @@ class WithPropCustomClassComponent extends CustomClassComponent(WithPropCustomClassComponent, { - props: {} - }) + mount( + // @ts-expect-error should has props error + WithPropCustomClassComponent, + { + props: {} + } + ) +) +mount( + WithPropCustomClassComponent, + { + props: { size: 'small' } + } ) -mount(WithPropCustomClassComponent, { - props: { size: 'small' } -}) // endregion @@ -313,7 +318,6 @@ mount(Foo, { expectError( mount( - // @ts-expect-error defineComponent({ props: { baz: String, @@ -324,6 +328,7 @@ expectError( } }), { + // @ts-expect-error props: { baz: 'hello' } diff --git a/test-dts/shallowMount.d-test.ts b/test-dts/shallowMount.d-test.ts index aa117f68f..3846a3c61 100644 --- a/test-dts/shallowMount.d-test.ts +++ b/test-dts/shallowMount.d-test.ts @@ -27,8 +27,8 @@ shallowMount(AppWithDefine, { }) expectError( - // @ts-expect-error wrong prop type should not compile shallowMount(AppWithDefine, { + // @ts-expect-error wrong prop type should not compile props: { a: 2 } }) ) @@ -97,7 +97,7 @@ wrapper = shallowMount(AppWithoutProps, { } }) class ClassComponent extends Vue { - dataText: string = '' + dataText = '' get computedMsg(): string { return `Message: ${(this.$props as any).msg}` } diff --git a/tests/features/compat.spec.ts b/tests/features/compat.spec.ts index 9a0b9166d..6ad824b75 100644 --- a/tests/features/compat.spec.ts +++ b/tests/features/compat.spec.ts @@ -3,7 +3,7 @@ import { mount } from '../../src' jest.mock('vue', () => mockVue) -const { configureCompat, extend, defineComponent, h } = mockVue as any +const { configureCompat, extend, defineComponent, h } = mockVue describe('@vue/compat build', () => { describe.each(['suppress-warning', false])( diff --git a/tests/mountingOptions/mocks.spec.ts b/tests/mountingOptions/mocks.spec.ts index adcda4eb5..364343cd0 100644 --- a/tests/mountingOptions/mocks.spec.ts +++ b/tests/mountingOptions/mocks.spec.ts @@ -38,10 +38,10 @@ describe('mocks', () => { `, computed: { - url() { + url(): string { return `/posts/${this.$route.params.id}` }, - id() { + id(): string | string[] { return this.$route.params.id } }, diff --git a/types/compat.d.ts b/types/compat.d.ts index 397abd620..c4b038685 100644 --- a/types/compat.d.ts +++ b/types/compat.d.ts @@ -1,3 +1,8 @@ declare module '@vue/compat' { export * from 'vue' + export function extend(options: T): T + + export function configureCompat( + option: Record + ): void } diff --git a/yarn.lock b/yarn.lock index b1dc22475..65c4ab992 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1744,10 +1744,10 @@ html-tags "^3.1.0" svg-tags "^1.0.0" -"@vue/compat@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/compat/-/compat-3.2.33.tgz#d7080bf24247e730fe9c33e9782ae4fba66ec347" - integrity sha512-8g2W2Na+vEKq9dhj/OkfesgSdr8kXx7ehC1tPCngGq1MD/Q6Q0ydnpcD0sNaGFP4R/8Zccp0LIpMSnj8qKGXBQ== +"@vue/compat@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/compat/-/compat-3.2.34.tgz#481e762948c788149ee97cf1dce38572e94f8ef1" + integrity sha512-FYPfdmZefzWoOO7wtNm9mxTHL3nZNAGNrac55BvEARZagphXGKXyvOHWDAWpdxWHCyGDLNaRGW5ZFAd0RO1XYQ== "@vue/compiler-core@3.2.31", "@vue/compiler-core@^3.2.31": version "3.2.31" @@ -1759,13 +1759,13 @@ estree-walker "^2.0.2" source-map "^0.6.1" -"@vue/compiler-core@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.33.tgz#e915d59cce85898f5c5cfebe4c09e539278c3d59" - integrity sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw== +"@vue/compiler-core@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.34.tgz#e28fe9d2b22dcb60274daea6df07e653d8a3ecbe" + integrity sha512-Y53lv04ZhDfqflhk4yEgBZrCL1RipbxqmqJFfl1PRkjOzt0bvJpf1sCNN81QNfXohVwFGf+Hng2ztwLwOZgbuA== dependencies: "@babel/parser" "^7.16.4" - "@vue/shared" "3.2.33" + "@vue/shared" "3.2.34" estree-walker "^2.0.2" source-map "^0.6.1" @@ -1777,25 +1777,25 @@ "@vue/compiler-core" "3.2.31" "@vue/shared" "3.2.31" -"@vue/compiler-dom@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz#6db84296f949f18e5d3e7fd5e80f943dbed7d5ec" - integrity sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ== +"@vue/compiler-dom@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.34.tgz#3aadd83fd789c7feaa56f838e86c5c7146395579" + integrity sha512-MFLUYDgy0aES9x1goU/pgxpzgT9IZOndO8qwQVSyVfUvl/CywEBtfBi5+8fsiBDhoGIT7g8qcsUUF1NYViU2vQ== dependencies: - "@vue/compiler-core" "3.2.33" - "@vue/shared" "3.2.33" + "@vue/compiler-core" "3.2.34" + "@vue/shared" "3.2.34" -"@vue/compiler-sfc@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz#7ce01dc947a8b76c099811dc6ca58494d4dc773d" - integrity sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q== +"@vue/compiler-sfc@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.34.tgz#3c02b261e631f20587b31e2b9ddc5596cd36c9da" + integrity sha512-I+vT4soKJtdsoREBDYAcz56+yGpZ5T3GUigvBFgC2yTeTtBtREOPzYw8kZyMuD2ZlryPYBkbV8D9xxcvU0j/aw== dependencies: "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.33" - "@vue/compiler-dom" "3.2.33" - "@vue/compiler-ssr" "3.2.33" - "@vue/reactivity-transform" "3.2.33" - "@vue/shared" "3.2.33" + "@vue/compiler-core" "3.2.34" + "@vue/compiler-dom" "3.2.34" + "@vue/compiler-ssr" "3.2.34" + "@vue/reactivity-transform" "3.2.34" + "@vue/shared" "3.2.34" estree-walker "^2.0.2" magic-string "^0.25.7" postcss "^8.1.10" @@ -1825,13 +1825,13 @@ "@vue/compiler-dom" "3.2.31" "@vue/shared" "3.2.31" -"@vue/compiler-ssr@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz#3e820267e4eea48fde9519f006dedca3f5e42e71" - integrity sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ== +"@vue/compiler-ssr@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.34.tgz#5e2acc9c051cf877e6a5da20ffd4ff0257d9f4c5" + integrity sha512-zyaMdGJhxoA34ibWsXF7VH1PO5yrNB1MZg/ByRfXGM8JefGQaz+PpHvBy/5OI0ehEyhAyCb7279JdhYHacMZbw== dependencies: - "@vue/compiler-dom" "3.2.33" - "@vue/shared" "3.2.33" + "@vue/compiler-dom" "3.2.34" + "@vue/shared" "3.2.34" "@vue/devtools-api@^6.0.0", "@vue/devtools-api@^6.0.0-beta.11": version "6.0.12" @@ -1849,23 +1849,23 @@ estree-walker "^2.0.2" magic-string "^0.25.7" -"@vue/reactivity-transform@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz#286063f44ca56150ae9b52f8346a26e5913fa699" - integrity sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw== +"@vue/reactivity-transform@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.34.tgz#852894181ce70a09a2a4c7605d31ad8b8d068d87" + integrity sha512-OtsrL4/i6Md279pMhZ8wRijeDhPSdnXrH9wmqAcKDhVcp1L2kSWlgVVLa1jGIyyFYE806YiJNJiGBvXPGXMzxw== dependencies: "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.33" - "@vue/shared" "3.2.33" + "@vue/compiler-core" "3.2.34" + "@vue/shared" "3.2.34" estree-walker "^2.0.2" magic-string "^0.25.7" -"@vue/reactivity@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.33.tgz#c84eedb5225138dbfc2472864c151d3efbb4b673" - integrity sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ== +"@vue/reactivity@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.34.tgz#660e7217a529d788326d22ff89473cdd101ce1ad" + integrity sha512-xbRIOPqxdNOr0zS47moRS6zf4BKd0z+55R85UJlo4r5ezqCktk6fYy1atY4tGzo7Maqh6QoKw3LtIKvpz8d7WA== dependencies: - "@vue/shared" "3.2.33" + "@vue/shared" "3.2.34" "@vue/reactivity@^3.2.31": version "3.2.31" @@ -1874,40 +1874,40 @@ dependencies: "@vue/shared" "3.2.31" -"@vue/runtime-core@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.33.tgz#2df8907c85c37c3419fbd1bdf1a2df097fa40df2" - integrity sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw== +"@vue/runtime-core@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.34.tgz#98cb706de9762485a81561329f70b740386f9f7b" + integrity sha512-GtaHqYiuEb56OA0cbMh20UPpDiXGRX+NS1buKif4OL341JJ3NtmNOIchCzknaN76oN6KqrLiO82/+TEZXl2Xtw== dependencies: - "@vue/reactivity" "3.2.33" - "@vue/shared" "3.2.33" + "@vue/reactivity" "3.2.34" + "@vue/shared" "3.2.34" -"@vue/runtime-dom@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz#123b8969247029ea0d9c1983676d4706a962d848" - integrity sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw== +"@vue/runtime-dom@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.34.tgz#747acc8a41410f59ecff97ef01cd2a665e6b1101" + integrity sha512-uqizbaJqmNH3O4TRr+8cM1tid5ODWHyQYZ3CLWcjn3dLkf0N7wvNuhUELQUZU/wQLvVMhJUQNrmOqckHLm6Xpw== dependencies: - "@vue/runtime-core" "3.2.33" - "@vue/shared" "3.2.33" + "@vue/runtime-core" "3.2.34" + "@vue/shared" "3.2.34" csstype "^2.6.8" -"@vue/server-renderer@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.33.tgz#4b45d6d2ae10ea4e3d2cf8e676804cf60f331979" - integrity sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew== +"@vue/server-renderer@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.34.tgz#3efac854311cf13754734b3bae2829946f665f60" + integrity sha512-PMnBAq1BexPFXBxuLngp4lQvc0XQD1CBDIHtEsG0pRusGWVJddBUKlR/EnnSvGaJ34YmKkAl9kdvczOz0kddew== dependencies: - "@vue/compiler-ssr" "3.2.33" - "@vue/shared" "3.2.33" + "@vue/compiler-ssr" "3.2.34" + "@vue/shared" "3.2.34" "@vue/shared@3.2.31", "@vue/shared@^3.2.31": version "3.2.31" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.31.tgz#c90de7126d833dcd3a4c7534d534be2fb41faa4e" integrity sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ== -"@vue/shared@3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.33.tgz#69a8c99ceb37c1b031d5cc4aec2ff1dc77e1161e" - integrity sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg== +"@vue/shared@3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.34.tgz#b71750d05120feb644102088a09be64518cd3a86" + integrity sha512-zhEeB8TrFmTXmTXmu/wcjEhgrjO4xqdDQrCdPhjX7NxfoLqoBVKguOm8qyihWNLbP+41svYY4za9mqXyqFLzNg== "@vue/vue3-jest@27.0.0-alpha.4": version "27.0.0-alpha.4" @@ -5384,16 +5384,16 @@ vue-tsc@0.34.15: dependencies: "@volar/vue-typescript" "0.34.15" -vue@3.2.33, vue@^3.2.33: - version "3.2.33" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.33.tgz#7867eb16a3293a28c4d190a837bc447878bd64c2" - integrity sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ== +vue@3.2.34, vue@^3.2.33: + version "3.2.34" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.34.tgz#4d42a929398a8a2e1dff25ceddd4451b3add841c" + integrity sha512-gXRg5v8OSmGT4ZiQ/X/Pcz6Fr2igHQx/wvRH/pLnt0VvjfGGqrwhnwjYZilLP4HBcO211rMD9PpU6lfWfIv3wg== dependencies: - "@vue/compiler-dom" "3.2.33" - "@vue/compiler-sfc" "3.2.33" - "@vue/runtime-dom" "3.2.33" - "@vue/server-renderer" "3.2.33" - "@vue/shared" "3.2.33" + "@vue/compiler-dom" "3.2.34" + "@vue/compiler-sfc" "3.2.34" + "@vue/runtime-dom" "3.2.34" + "@vue/server-renderer" "3.2.34" + "@vue/shared" "3.2.34" vuex@^4.0.2: version "4.0.2"