From 552322076cf05cbab14cb2c314abdaeb062da234 Mon Sep 17 00:00:00 2001 From: ced Date: Tue, 15 Nov 2022 11:38:11 +0100 Subject: [PATCH 1/4] refactor: proper type for hasSetupState util function --- src/mount.ts | 4 ++-- src/utils.ts | 4 +++- src/vueWrapper.ts | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mount.ts b/src/mount.ts index a991814d6..afeca3239 100644 --- a/src/mount.ts +++ b/src/mount.ts @@ -485,8 +485,8 @@ export function mount( // otherwise we run into a proxy set error // due to https://github.com/vuejs/core/commit/f73925d76a76ee259749b8b48cb68895f539a00f#diff-ea4d1ddabb7e22e17e80ada458eef70679af4005df2a1a6b73418fec897603ceR404 // introduced in Vue v3.2.45 - if (hasSetupState(this as any)) { - ;(this as any).$.setupState[k] = v + if (hasSetupState(this)) { + this.$.setupState[k] = v } else { ;(this as any)[k] = v } diff --git a/src/utils.ts b/src/utils.ts index e2780518f..a6a99185b 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -188,7 +188,9 @@ export function getDirectivesFromStubs( } export function hasSetupState( vm: ComponentPublicInstance -): vm is ComponentPublicInstance & { setupState: Record } { +): vm is ComponentPublicInstance & { + $: { setupState: Record } +} { return ( vm && (vm.$ as unknown as { devtoolsRawSetupState: any }).devtoolsRawSetupState diff --git a/src/vueWrapper.ts b/src/vueWrapper.ts index 356ae09d9..1d5fb40a0 100644 --- a/src/vueWrapper.ts +++ b/src/vueWrapper.ts @@ -108,7 +108,7 @@ export class VueWrapper< // or for components with a setup that returns a render function (as they have an empty proxy) // in both cases, we return `vm` directly instead if (hasSetupState(vm)) { - this.componentVM = createVMProxy(vm, (vm.$ as any).setupState) + this.componentVM = createVMProxy(vm, vm.$.setupState) } else { this.componentVM = vm } From b59f696fc2f59da0104eb8924d8ffca98a69c3f2 Mon Sep 17 00:00:00 2001 From: ced Date: Thu, 17 Nov 2022 10:28:46 +0100 Subject: [PATCH 2/4] chore: update to typescript v4.9.2 Fixes #1872 Fixes the errors arising with script setup components: ``` tests/features/ScriptSetup_ToRefsInject.spec.ts:6:25 - error TS2769: No overload matches this call. The last overload gave the following error. Argument of type 'ComponentPublicInstanceConstructor<{ $: ComponentInternalInstance; $data: {}; $props: Partial<{}> & Omit>> & VNodeProps & AllowedComponentProps & ComponentCustomProps, never>; ... 10 more ...; $watch any...' is not assignable to parameter of type 'ComponentOptionsWithObjectProps<__VLS_TypePropsToRuntimeProps<{ title: string; }>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ... 5 more ..., {}>'. Type 'ComponentPublicInstanceConstructor<{ $: ComponentInternalInstance; $data: {}; $props: Partial<{}> & Omit>> & VNodeProps & AllowedComponentProps & ComponentCustomProps, never>; ... 10 more ...; $watch any...' is not assignable to type 'ComponentOptionsBase>> & { [x: `on${Capitalize}`]: ((...args: any[]) => any) | undefined; }, ... 10 more ..., string>'. Types of property 'setup' are incompatible. Type '((this: void, props: Readonly>>>>, ctx: SetupContext<...>) => void | ... 2 more ... | Promise<...>) | undefined' is not assignable to type '((this: void, props: Readonly>> & { [x: `on${Capitalize}`]: ((...args: any[]) => any) | undefined; }>>, ctx: SetupContext<...>) => void | ... 2 more ... | Promise<...>) | undefined'. Type '(this: void, props: Readonly>>>>, ctx: SetupContext<...>) => void | ... 2 more ... | Promise<...>' is not assignable to type '(this: void, props: Readonly>> & { [x: `on${Capitalize}`]: ((...args: any[]) => any) | undefined; }>>, ctx: SetupContext<...>) => void | ... 2 more ... | Promise<...>'. Types of parameters 'ctx' and 'ctx' are incompatible. Type 'SetupContext' is not assignable to type 'SetupContext<{}>'. 6 const wrapper = mount(ScriptSetup_ToRefsInject, { ``` --- package.json | 2 +- pnpm-lock.yaml | 66 +++++++++++++++++++++++++------------------------- src/mount.ts | 2 +- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index ea432180b..6cd9942ff 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "reflect-metadata": "0.1.13", "rollup": "3.2.5", "tslib": "2.4.1", - "typescript": "4.8.4", + "typescript": "4.9.3", "unplugin-vue-components": "0.22.9", "vite": "3.2.3", "vitepress": "0.22.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4557ee62b..dc362dd43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,7 +30,7 @@ specifiers: reflect-metadata: 0.1.13 rollup: 3.2.5 tslib: 2.4.1 - typescript: 4.8.4 + typescript: 4.9.3 unplugin-vue-components: 0.22.9 vite: 3.2.3 vitepress: 0.22.4 @@ -46,11 +46,11 @@ devDependencies: '@rollup/plugin-json': 5.0.1_rollup@3.2.5 '@rollup/plugin-node-resolve': 15.0.1_rollup@3.2.5 '@rollup/plugin-replace': 5.0.1_rollup@3.2.5 - '@rollup/plugin-typescript': 9.0.2_skqhbvp355vci76ty3pdffvjrq + '@rollup/plugin-typescript': 9.0.2_zvi5mf76duikkrx6zp62lgsvga '@types/js-beautify': 1.13.3 '@types/node': 18.11.9 - '@typescript-eslint/eslint-plugin': 5.42.1_2udltptbznfmezdozpdoa2aemq - '@typescript-eslint/parser': 5.42.1_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/eslint-plugin': 5.42.1_a76fwnskzo2n3ynumjbqxmyj7i + '@typescript-eslint/parser': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y '@vitejs/plugin-vue': 3.2.0_vite@3.2.3+vue@3.2.45 '@vitejs/plugin-vue-jsx': 2.1.1_vite@3.2.3+vue@3.2.45 '@vitest/coverage-c8': 0.25.2_jsdom@20.0.2 @@ -71,7 +71,7 @@ devDependencies: reflect-metadata: 0.1.13 rollup: 3.2.5 tslib: 2.4.1 - typescript: 4.8.4 + typescript: 4.9.3 unplugin-vue-components: 0.22.9_rollup@3.2.5+vue@3.2.45 vite: 3.2.3_@types+node@18.11.9 vitepress: 0.22.4 @@ -79,7 +79,7 @@ devDependencies: vue: 3.2.45 vue-class-component: 8.0.0-rc.1_vue@3.2.45 vue-router: 4.1.6_vue@3.2.45 - vue-tsc: 1.0.9_typescript@4.8.4 + vue-tsc: 1.0.9_typescript@4.9.3 vuex: 4.1.0_vue@3.2.45 packages: @@ -717,7 +717,7 @@ packages: rollup: 3.2.5 dev: true - /@rollup/plugin-typescript/9.0.2_skqhbvp355vci76ty3pdffvjrq: + /@rollup/plugin-typescript/9.0.2_zvi5mf76duikkrx6zp62lgsvga: resolution: {integrity: sha512-/sS93vmHUMjzDUsl5scNQr1mUlNE1QjBBvOhmRwJCH8k2RRhDIm3c977B3wdu3t3Ap17W6dDeXP3hj1P1Un1bA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -734,7 +734,7 @@ packages: resolve: 1.22.1 rollup: 3.2.5 tslib: 2.4.1 - typescript: 4.8.4 + typescript: 4.9.3 dev: true /@rollup/pluginutils/5.0.2_rollup@3.2.5: @@ -795,7 +795,7 @@ packages: resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==} dev: true - /@typescript-eslint/eslint-plugin/5.42.1_2udltptbznfmezdozpdoa2aemq: + /@typescript-eslint/eslint-plugin/5.42.1_a76fwnskzo2n3ynumjbqxmyj7i: resolution: {integrity: sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -806,23 +806,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.42.1_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/parser': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y '@typescript-eslint/scope-manager': 5.42.1 - '@typescript-eslint/type-utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy - '@typescript-eslint/utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/type-utils': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y + '@typescript-eslint/utils': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y debug: 4.3.4 eslint: 8.27.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + tsutils: 3.21.0_typescript@4.9.3 + typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.42.1_rmayb2veg2btbq6mbmnyivgasy: + /@typescript-eslint/parser/5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y: resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -834,10 +834,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.42.1 '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 + '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.3 debug: 4.3.4 eslint: 8.27.0 - typescript: 4.8.4 + typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true @@ -850,7 +850,7 @@ packages: '@typescript-eslint/visitor-keys': 5.42.1 dev: true - /@typescript-eslint/type-utils/5.42.1_rmayb2veg2btbq6mbmnyivgasy: + /@typescript-eslint/type-utils/5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y: resolution: {integrity: sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -860,12 +860,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 - '@typescript-eslint/utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.3 + '@typescript-eslint/utils': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y debug: 4.3.4 eslint: 8.27.0 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + tsutils: 3.21.0_typescript@4.9.3 + typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true @@ -875,7 +875,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.42.1_typescript@4.8.4: + /@typescript-eslint/typescript-estree/5.42.1_typescript@4.9.3: resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -890,13 +890,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + tsutils: 3.21.0_typescript@4.9.3 + typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.42.1_rmayb2veg2btbq6mbmnyivgasy: + /@typescript-eslint/utils/5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y: resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -906,7 +906,7 @@ packages: '@types/semver': 7.3.12 '@typescript-eslint/scope-manager': 5.42.1 '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 + '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.3 eslint: 8.27.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.27.0 @@ -3517,14 +3517,14 @@ packages: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true - /tsutils/3.21.0_typescript@4.8.4: + /tsutils/3.21.0_typescript@4.9.3: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.8.4 + typescript: 4.9.3 dev: true /type-check/0.3.2: @@ -3556,8 +3556,8 @@ packages: engines: {node: '>=10'} dev: true - /typescript/4.8.4: - resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} + /typescript/4.9.3: + resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -3784,7 +3784,7 @@ packages: he: 1.2.0 dev: true - /vue-tsc/1.0.9_typescript@4.8.4: + /vue-tsc/1.0.9_typescript@4.9.3: resolution: {integrity: sha512-vRmHD1K6DmBymNhoHjQy/aYKTRQNLGOu2/ESasChG9Vy113K6CdP0NlhR0bzgFJfv2eFB9Ez/9L5kIciUajBxQ==} hasBin: true peerDependencies: @@ -3792,7 +3792,7 @@ packages: dependencies: '@volar/vue-language-core': 1.0.9 '@volar/vue-typescript': 1.0.9 - typescript: 4.8.4 + typescript: 4.9.3 dev: true /vue/3.2.45: diff --git a/src/mount.ts b/src/mount.ts index afeca3239..8a607aa47 100644 --- a/src/mount.ts +++ b/src/mount.ts @@ -203,7 +203,7 @@ export function mount< > > // component declared by vue-tsc ScriptSetup -export function mount>( +export function mount>( component: T, options?: ComponentMountingOptions ): VueWrapper> From 046dacb4dec9ccf14f890629d3f96aa41710ea34 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 17 Nov 2022 09:36:38 +0000 Subject: [PATCH 3/4] chore(deps): update all non-major dependencies --- package.json | 8 +-- pnpm-lock.yaml | 154 ++++++++++++++++++++++++------------------------- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/package.json b/package.json index 6cd9942ff..74d670b12 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,8 @@ "@rollup/plugin-typescript": "9.0.2", "@types/js-beautify": "1.13.3", "@types/node": "18.11.9", - "@typescript-eslint/eslint-plugin": "5.42.1", - "@typescript-eslint/parser": "5.42.1", + "@typescript-eslint/eslint-plugin": "5.43.0", + "@typescript-eslint/parser": "5.43.0", "@vitejs/plugin-vue": "3.2.0", "@vitejs/plugin-vue-jsx": "2.1.1", "@vitest/coverage-c8": "0.25.2", @@ -49,11 +49,11 @@ "lint-staged": "13.0.3", "prettier": "2.7.1", "reflect-metadata": "0.1.13", - "rollup": "3.2.5", + "rollup": "3.3.0", "tslib": "2.4.1", "typescript": "4.9.3", "unplugin-vue-components": "0.22.9", - "vite": "3.2.3", + "vite": "3.2.4", "vitepress": "0.22.4", "vitest": "0.25.2", "vue": "3.2.45", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc362dd43..962bfda76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,8 +8,8 @@ specifiers: '@rollup/plugin-typescript': 9.0.2 '@types/js-beautify': 1.13.3 '@types/node': 18.11.9 - '@typescript-eslint/eslint-plugin': 5.42.1 - '@typescript-eslint/parser': 5.42.1 + '@typescript-eslint/eslint-plugin': 5.43.0 + '@typescript-eslint/parser': 5.43.0 '@vitejs/plugin-vue': 3.2.0 '@vitejs/plugin-vue-jsx': 2.1.1 '@vitest/coverage-c8': 0.25.2 @@ -28,11 +28,11 @@ specifiers: lint-staged: 13.0.3 prettier: 2.7.1 reflect-metadata: 0.1.13 - rollup: 3.2.5 + rollup: 3.3.0 tslib: 2.4.1 typescript: 4.9.3 unplugin-vue-components: 0.22.9 - vite: 3.2.3 + vite: 3.2.4 vitepress: 0.22.4 vitest: 0.25.2 vue: 3.2.45 @@ -42,17 +42,17 @@ specifiers: vuex: 4.1.0 devDependencies: - '@rollup/plugin-commonjs': 23.0.2_rollup@3.2.5 - '@rollup/plugin-json': 5.0.1_rollup@3.2.5 - '@rollup/plugin-node-resolve': 15.0.1_rollup@3.2.5 - '@rollup/plugin-replace': 5.0.1_rollup@3.2.5 - '@rollup/plugin-typescript': 9.0.2_zvi5mf76duikkrx6zp62lgsvga + '@rollup/plugin-commonjs': 23.0.2_rollup@3.3.0 + '@rollup/plugin-json': 5.0.1_rollup@3.3.0 + '@rollup/plugin-node-resolve': 15.0.1_rollup@3.3.0 + '@rollup/plugin-replace': 5.0.1_rollup@3.3.0 + '@rollup/plugin-typescript': 9.0.2_anaopcb6zpom6gf4l2cmpvnrfm '@types/js-beautify': 1.13.3 '@types/node': 18.11.9 - '@typescript-eslint/eslint-plugin': 5.42.1_a76fwnskzo2n3ynumjbqxmyj7i - '@typescript-eslint/parser': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y - '@vitejs/plugin-vue': 3.2.0_vite@3.2.3+vue@3.2.45 - '@vitejs/plugin-vue-jsx': 2.1.1_vite@3.2.3+vue@3.2.45 + '@typescript-eslint/eslint-plugin': 5.43.0_wze2rj5tow7zwqpgbdx2buoy3m + '@typescript-eslint/parser': 5.43.0_e3uo4sehh4zr4i6m57mkkxxv7y + '@vitejs/plugin-vue': 3.2.0_vite@3.2.4+vue@3.2.45 + '@vitejs/plugin-vue-jsx': 2.1.1_vite@3.2.4+vue@3.2.45 '@vitest/coverage-c8': 0.25.2_jsdom@20.0.2 '@vue/compat': 3.2.45_vue@3.2.45 '@vue/compiler-dom': 3.2.45 @@ -69,11 +69,11 @@ devDependencies: lint-staged: 13.0.3 prettier: 2.7.1 reflect-metadata: 0.1.13 - rollup: 3.2.5 + rollup: 3.3.0 tslib: 2.4.1 typescript: 4.9.3 - unplugin-vue-components: 0.22.9_rollup@3.2.5+vue@3.2.45 - vite: 3.2.3_@types+node@18.11.9 + unplugin-vue-components: 0.22.9_rollup@3.3.0+vue@3.2.45 + vite: 3.2.4_@types+node@18.11.9 vitepress: 0.22.4 vitest: 0.25.2_jsdom@20.0.2 vue: 3.2.45 @@ -654,7 +654,7 @@ packages: fastq: 1.13.0 dev: true - /@rollup/plugin-commonjs/23.0.2_rollup@3.2.5: + /@rollup/plugin-commonjs/23.0.2_rollup@3.3.0: resolution: {integrity: sha512-e9ThuiRf93YlVxc4qNIurvv+Hp9dnD+4PjOqQs5vAYfcZ3+AXSrcdzXnVjWxcGQOa6KGJFcRZyUI3ktWLavFjg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -663,16 +663,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.2.5 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.0.3 is-reference: 1.2.1 magic-string: 0.26.7 - rollup: 3.2.5 + rollup: 3.3.0 dev: true - /@rollup/plugin-json/5.0.1_rollup@3.2.5: + /@rollup/plugin-json/5.0.1_rollup@3.3.0: resolution: {integrity: sha512-QCwhZZLvM8nRcTHyR1vOgyTMiAnjiNj1ebD/BMRvbO1oc/z14lZH6PfxXeegee2B6mky/u9fia4fxRM4TqrUaw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -681,11 +681,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.2.5 - rollup: 3.2.5 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 + rollup: 3.3.0 dev: true - /@rollup/plugin-node-resolve/15.0.1_rollup@3.2.5: + /@rollup/plugin-node-resolve/15.0.1_rollup@3.3.0: resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -694,16 +694,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.2.5 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 '@types/resolve': 1.20.2 deepmerge: 4.2.2 is-builtin-module: 3.2.0 is-module: 1.0.0 resolve: 1.22.1 - rollup: 3.2.5 + rollup: 3.3.0 dev: true - /@rollup/plugin-replace/5.0.1_rollup@3.2.5: + /@rollup/plugin-replace/5.0.1_rollup@3.3.0: resolution: {integrity: sha512-Z3MfsJ4CK17BfGrZgvrcp/l6WXoKb0kokULO+zt/7bmcyayokDaQ2K3eDJcRLCTAlp5FPI4/gz9MHAsosz4Rag==} engines: {node: '>=14.0.0'} peerDependencies: @@ -712,12 +712,12 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.2.5 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 magic-string: 0.26.7 - rollup: 3.2.5 + rollup: 3.3.0 dev: true - /@rollup/plugin-typescript/9.0.2_zvi5mf76duikkrx6zp62lgsvga: + /@rollup/plugin-typescript/9.0.2_anaopcb6zpom6gf4l2cmpvnrfm: resolution: {integrity: sha512-/sS93vmHUMjzDUsl5scNQr1mUlNE1QjBBvOhmRwJCH8k2RRhDIm3c977B3wdu3t3Ap17W6dDeXP3hj1P1Un1bA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -730,14 +730,14 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.2.5 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 resolve: 1.22.1 - rollup: 3.2.5 + rollup: 3.3.0 tslib: 2.4.1 typescript: 4.9.3 dev: true - /@rollup/pluginutils/5.0.2_rollup@3.2.5: + /@rollup/pluginutils/5.0.2_rollup@3.3.0: resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -749,7 +749,7 @@ packages: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.2.5 + rollup: 3.3.0 dev: true /@tootallnate/once/2.0.0: @@ -795,8 +795,8 @@ packages: resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==} dev: true - /@typescript-eslint/eslint-plugin/5.42.1_a76fwnskzo2n3ynumjbqxmyj7i: - resolution: {integrity: sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg==} + /@typescript-eslint/eslint-plugin/5.43.0_wze2rj5tow7zwqpgbdx2buoy3m: + resolution: {integrity: sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -806,10 +806,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y - '@typescript-eslint/scope-manager': 5.42.1 - '@typescript-eslint/type-utils': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y - '@typescript-eslint/utils': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y + '@typescript-eslint/parser': 5.43.0_e3uo4sehh4zr4i6m57mkkxxv7y + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/type-utils': 5.43.0_e3uo4sehh4zr4i6m57mkkxxv7y + '@typescript-eslint/utils': 5.43.0_e3uo4sehh4zr4i6m57mkkxxv7y debug: 4.3.4 eslint: 8.27.0 ignore: 5.2.0 @@ -822,8 +822,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y: - resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} + /@typescript-eslint/parser/5.43.0_e3uo4sehh4zr4i6m57mkkxxv7y: + resolution: {integrity: sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -832,9 +832,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.42.1 - '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.3 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.9.3 debug: 4.3.4 eslint: 8.27.0 typescript: 4.9.3 @@ -842,16 +842,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.42.1: - resolution: {integrity: sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==} + /@typescript-eslint/scope-manager/5.43.0: + resolution: {integrity: sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/visitor-keys': 5.42.1 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/visitor-keys': 5.43.0 dev: true - /@typescript-eslint/type-utils/5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y: - resolution: {integrity: sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg==} + /@typescript-eslint/type-utils/5.43.0_e3uo4sehh4zr4i6m57mkkxxv7y: + resolution: {integrity: sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -860,8 +860,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.3 - '@typescript-eslint/utils': 5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.9.3 + '@typescript-eslint/utils': 5.43.0_e3uo4sehh4zr4i6m57mkkxxv7y debug: 4.3.4 eslint: 8.27.0 tsutils: 3.21.0_typescript@4.9.3 @@ -870,13 +870,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.42.1: - resolution: {integrity: sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==} + /@typescript-eslint/types/5.43.0: + resolution: {integrity: sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.42.1_typescript@4.9.3: - resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==} + /@typescript-eslint/typescript-estree/5.43.0_typescript@4.9.3: + resolution: {integrity: sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -884,8 +884,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/visitor-keys': 5.42.1 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/visitor-keys': 5.43.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -896,17 +896,17 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.42.1_e3uo4sehh4zr4i6m57mkkxxv7y: - resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==} + /@typescript-eslint/utils/5.43.0_e3uo4sehh4zr4i6m57mkkxxv7y: + resolution: {integrity: sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 '@types/semver': 7.3.12 - '@typescript-eslint/scope-manager': 5.42.1 - '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.3 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.9.3 eslint: 8.27.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.27.0 @@ -916,15 +916,15 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.42.1: - resolution: {integrity: sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==} + /@typescript-eslint/visitor-keys/5.43.0: + resolution: {integrity: sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.42.1 + '@typescript-eslint/types': 5.43.0 eslint-visitor-keys: 3.3.0 dev: true - /@vitejs/plugin-vue-jsx/2.1.1_vite@3.2.3+vue@3.2.45: + /@vitejs/plugin-vue-jsx/2.1.1_vite@3.2.4+vue@3.2.45: resolution: {integrity: sha512-JgDhxstQlwnHBvZ1BSnU5mbmyQ14/t5JhREc6YH5kWyu2QdAAOsLF6xgHoIWarj8tddaiwFrNzLbWJPudpXKYA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -934,7 +934,7 @@ packages: '@babel/core': 7.19.6 '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.19.6 '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.19.6 - vite: 3.2.3_@types+node@18.11.9 + vite: 3.2.4_@types+node@18.11.9 vue: 3.2.45 transitivePeerDependencies: - supports-color @@ -951,14 +951,14 @@ packages: vue: 3.2.45 dev: true - /@vitejs/plugin-vue/3.2.0_vite@3.2.3+vue@3.2.45: + /@vitejs/plugin-vue/3.2.0_vite@3.2.4+vue@3.2.45: resolution: {integrity: sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^3.0.0 vue: ^3.2.25 dependencies: - vite: 3.2.3_@types+node@18.11.9 + vite: 3.2.4_@types+node@18.11.9 vue: 3.2.45 dev: true @@ -3251,8 +3251,8 @@ packages: fsevents: 2.3.2 dev: true - /rollup/3.2.5: - resolution: {integrity: sha512-/Ha7HhVVofduy+RKWOQJrxe4Qb3xyZo+chcpYiD8SoQa4AG7llhupUtyfKSSrdBM2mWJjhM8wZwmbY23NmlIYw==} + /rollup/3.3.0: + resolution: {integrity: sha512-wqOV/vUJCYEbWsXvwCkgGWvgaEnsbn4jxBQWKpN816CqsmCimDmCNJI83c6if7QVD4v/zlyRzxN7U2yDT5rfoA==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -3567,7 +3567,7 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /unplugin-vue-components/0.22.9_rollup@3.2.5+vue@3.2.45: + /unplugin-vue-components/0.22.9_rollup@3.3.0+vue@3.2.45: resolution: {integrity: sha512-qBvooq3EgpjtYicxeccRUGUBBQCCw9rJ0kHPZPOSJd8TBZViSv86vuKLTRDHPyjWtclwOIkVStZJfPdJFhYUMw==} engines: {node: '>=14'} peerDependencies: @@ -3578,7 +3578,7 @@ packages: optional: true dependencies: '@antfu/utils': 0.6.0 - '@rollup/pluginutils': 5.0.2_rollup@3.2.5 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 chokidar: 3.5.3 debug: 4.3.4 fast-glob: 3.2.12 @@ -3659,8 +3659,8 @@ packages: fsevents: 2.3.2 dev: true - /vite/3.2.3_@types+node@18.11.9: - resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} + /vite/3.2.4_@types+node@18.11.9: + resolution: {integrity: sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -3750,7 +3750,7 @@ packages: tinybench: 2.3.1 tinypool: 0.3.0 tinyspy: 1.0.2 - vite: 3.2.3_@types+node@18.11.9 + vite: 3.2.4_@types+node@18.11.9 transitivePeerDependencies: - less - sass From f2b9091afeea2e30dcb4b878287d4264ea384428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Exbrayat?= Date: Sun, 20 Nov 2022 23:32:29 +0100 Subject: [PATCH 4/4] fix: allow to mock global function in script setup components (#1871) Fixes #1869 --- src/mount.ts | 45 ++++++++++++++----- src/utils.ts | 1 - tests/components/ComponentWithI18n.vue | 16 +++++++ .../components/HelloFromVitestPlayground.vue | 17 +++++++ tests/components/ScriptSetupWithI18n.vue | 11 +++++ tests/mount.spec.ts | 11 ++++- tests/mountingOptions/mocks.spec.ts | 26 +++++++++++ types/testing.d.ts | 1 + 8 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 tests/components/ComponentWithI18n.vue create mode 100644 tests/components/HelloFromVitestPlayground.vue create mode 100644 tests/components/ScriptSetupWithI18n.vue diff --git a/src/mount.ts b/src/mount.ts index 8a607aa47..27735767c 100644 --- a/src/mount.ts +++ b/src/mount.ts @@ -478,16 +478,35 @@ export function mount( if (global?.mocks) { const mixin = defineComponent({ beforeCreate() { - for (const [k, v] of Object.entries( - global.mocks as { [key: string]: any } - )) { - // we need to differentiate components that are or not not `script setup` - // otherwise we run into a proxy set error - // due to https://github.com/vuejs/core/commit/f73925d76a76ee259749b8b48cb68895f539a00f#diff-ea4d1ddabb7e22e17e80ada458eef70679af4005df2a1a6b73418fec897603ceR404 - // introduced in Vue v3.2.45 - if (hasSetupState(this)) { - this.$.setupState[k] = v - } else { + // we need to differentiate components that are or not not `script setup` + // otherwise we run into a proxy set error + // due to https://github.com/vuejs/core/commit/f73925d76a76ee259749b8b48cb68895f539a00f#diff-ea4d1ddabb7e22e17e80ada458eef70679af4005df2a1a6b73418fec897603ceR404 + // introduced in Vue v3.2.45 + if (hasSetupState(this)) { + // add the mocks to setupState + for (const [k, v] of Object.entries( + global.mocks as { [key: string]: any } + )) { + // we do this in a try/catch, as some properties might be read-only + try { + this.$.setupState[k] = v + // eslint-disable-next-line no-empty + } catch (e) {} + } + // also intercept the proxy calls to make the mocks available on the instance + // (useful when a template access a global function like $t and the developer wants to mock it) + ;(this.$ as any).proxy = new Proxy((this.$ as any).proxy, { + get(target, key) { + if (key in global.mocks) { + return global.mocks[key as string] + } + return target[key] + } + }) + } else { + for (const [k, v] of Object.entries( + global.mocks as { [key: string]: any } + )) { ;(this as any)[k] = v } } @@ -604,8 +623,10 @@ export function mount( const appRef = componentRef.value! as ComponentPublicInstance // we add `hasOwnProperty` so Jest can spy on the proxied vm without throwing // note that this is not necessary with Jest v27+ or Vitest, but is kept for compatibility with older Jest versions - appRef.hasOwnProperty = (property) => { - return Reflect.has(appRef, property) + if (!app.hasOwnProperty) { + appRef.hasOwnProperty = (property) => { + return Reflect.has(appRef, property) + } } const wrapper = createVueWrapper(app, appRef, setProps) trackInstance(wrapper) diff --git a/src/utils.ts b/src/utils.ts index a6a99185b..be0cad37b 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -80,7 +80,6 @@ export const mergeDeep = ( if (!isObject(target) || !isObject(source)) { return source } - Object.keys(source).forEach((key) => { const targetValue = target[key] const sourceValue = source[key] diff --git a/tests/components/ComponentWithI18n.vue b/tests/components/ComponentWithI18n.vue new file mode 100644 index 000000000..d955296a3 --- /dev/null +++ b/tests/components/ComponentWithI18n.vue @@ -0,0 +1,16 @@ + + + diff --git a/tests/components/HelloFromVitestPlayground.vue b/tests/components/HelloFromVitestPlayground.vue new file mode 100644 index 000000000..d1bf7f677 --- /dev/null +++ b/tests/components/HelloFromVitestPlayground.vue @@ -0,0 +1,17 @@ + + + diff --git a/tests/components/ScriptSetupWithI18n.vue b/tests/components/ScriptSetupWithI18n.vue new file mode 100644 index 000000000..2540d36c2 --- /dev/null +++ b/tests/components/ScriptSetupWithI18n.vue @@ -0,0 +1,11 @@ + + + diff --git a/tests/mount.spec.ts b/tests/mount.spec.ts index 74f5b1c10..7c77d66c4 100644 --- a/tests/mount.spec.ts +++ b/tests/mount.spec.ts @@ -1,6 +1,7 @@ -import { describe, expect, it } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import { defineComponent } from 'vue' import { mount } from '../src' +import HelloFromVitestPlayground from './components/HelloFromVitestPlayground.vue' describe('mount: general tests', () => { it('correctly handles component, throwing on mount', () => { @@ -23,4 +24,12 @@ describe('mount: general tests', () => { expect(wrapper.html()).toBe('
hello
') }) + + it('should not warn on readonly hasOwnProperty when mounting a component', () => { + const spy = vi.spyOn(console, 'warn').mockImplementation(() => {}) + + mount(HelloFromVitestPlayground, { props: { count: 2 } }) + + expect(spy).not.toHaveBeenCalled() + }) }) diff --git a/tests/mountingOptions/mocks.spec.ts b/tests/mountingOptions/mocks.spec.ts index a37412814..2d9d410b1 100644 --- a/tests/mountingOptions/mocks.spec.ts +++ b/tests/mountingOptions/mocks.spec.ts @@ -1,6 +1,8 @@ import { describe, expect, it, vi } from 'vitest' import { mount, RouterLinkStub } from '../../src' import { defineComponent } from 'vue' +import ScriptSetupWithI18n from '../components/ScriptSetupWithI18n.vue' +import ComponentWithI18n from '../components/ComponentWithI18n.vue' describe('mocks', () => { it('mocks a vuex store', async () => { @@ -75,4 +77,28 @@ describe('mocks', () => { await wrapper.find('button').trigger('click') expect($router.push).toHaveBeenCalledWith('/posts/1') }) + + it('mocks a global function in a script setup component', () => { + const wrapper = mount(ScriptSetupWithI18n, { + global: { + mocks: { + $t: () => 'mocked' + } + } + }) + expect(wrapper.text()).toContain('hello') + expect(wrapper.text()).toContain('mocked') + }) + + it('mocks a global function in an option component', () => { + const wrapper = mount(ComponentWithI18n, { + global: { + mocks: { + $t: () => 'mocked' + } + } + }) + expect(wrapper.text()).toContain('hello') + expect(wrapper.text()).toContain('mocked') + }) }) diff --git a/types/testing.d.ts b/types/testing.d.ts index 4aa77f8f2..e67dcaac7 100644 --- a/types/testing.d.ts +++ b/types/testing.d.ts @@ -3,5 +3,6 @@ import type { Router } from 'vue-router' declare module '@vue/runtime-core' { interface ComponentCustomProperties { $router: Router + $t: (key: string) => string } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy