From 95ef3e04fd0fdf61b6464ad66dcebb955abe6971 Mon Sep 17 00:00:00 2001 From: Emma <1285641941@qq.com> Date: Sat, 24 Sep 2022 09:28:46 +0800 Subject: [PATCH 1/4] fix: return the correct name when stubbing a `script setup` component --- src/utils/componentName.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/utils/componentName.ts b/src/utils/componentName.ts index 15dad03d0..26b453279 100644 --- a/src/utils/componentName.ts +++ b/src/utils/componentName.ts @@ -38,7 +38,9 @@ export const getComponentName = ( type: VNodeTypes ): string => { if (isObjectComponent(type)) { - return getComponentNameInSetup(instance, type) || type.name || '' + return ( + getComponentNameInSetup(instance, type) || type.name || type.__name || '' + ) } if (isLegacyExtendedComponent(type)) { From 878b0e8dd0122afd97480af3f632240b2ea17a6c Mon Sep 17 00:00:00 2001 From: Emma <1285641941@qq.com> Date: Sun, 25 Sep 2022 19:29:44 +0800 Subject: [PATCH 2/4] test: stub a script setup component imported by unplugin-vue-components --- package.json | 1 + pnpm-lock.yaml | 117 ++++++++++++++++++++- tests/components/AutoImportScriptSetup.vue | 3 + tests/mountingOptions/global.stubs.spec.ts | 12 +++ vitest.config.ts | 11 +- 5 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 tests/components/AutoImportScriptSetup.vue diff --git a/package.json b/package.json index 7c0b0f84b..037cbb1cb 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "rollup-plugin-typescript2": "0.34.0", "tslib": "2.4.0", "typescript": "4.8.3", + "unplugin-vue-components": "^0.22.7", "vite": "3.1.3", "vitepress": "0.22.4", "vitest": "0.22.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b216981a7..e80edb900 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,6 +31,7 @@ specifiers: rollup-plugin-typescript2: 0.34.0 tslib: 2.4.0 typescript: 4.8.3 + unplugin-vue-components: ^0.22.7 vite: 3.1.3 vitepress: 0.22.4 vitest: 0.22.1 @@ -71,6 +72,7 @@ devDependencies: rollup-plugin-typescript2: 0.34.0_ihkqvyh37tzxtjmovjyy2yrv7m tslib: 2.4.0 typescript: 4.8.3 + unplugin-vue-components: 0.22.7_vue@3.2.39 vite: 3.1.3 vitepress: 0.22.4 vitest: 0.22.1_jsdom@20.0.0 @@ -203,6 +205,10 @@ packages: '@jridgewell/trace-mapping': 0.3.14 dev: true + /@antfu/utils/0.5.2: + resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} + dev: true + /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -1263,6 +1269,14 @@ packages: engines: {node: '>=12'} dev: true + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -1289,6 +1303,11 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1296,6 +1315,12 @@ packages: concat-map: 0.0.1 dev: true + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -1390,6 +1415,21 @@ packages: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -2260,8 +2300,8 @@ packages: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2440,7 +2480,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.11 + fast-glob: 3.2.12 ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 @@ -2564,6 +2604,13 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + /is-buffer/1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true @@ -2896,6 +2943,13 @@ packages: sourcemap-codec: 1.4.8 dev: true + /magic-string/0.26.4: + resolution: {integrity: sha512-e5uXtVJ22aEpK9u1+eQf0fSxHeqwyV19K+uGnlROCxUhzwRip9tBsaMViK/0vC3viyPd5Gtucp3UmEp/Q2cPTQ==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + /make-dir/3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -2948,6 +3002,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch/5.1.0: + resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -3217,6 +3278,13 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /reflect-metadata/0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: true @@ -3612,6 +3680,40 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unplugin-vue-components/0.22.7_vue@3.2.39: + resolution: {integrity: sha512-MJEAKJF9bRykTRvJ4WXF0FNMAyt1PX3iwpu2NN+li35sAKjQv6sC1col5aZDLiwDZDo2AGwxNkzLJFKaun9qHw==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + dependencies: + '@antfu/utils': 0.5.2 + '@rollup/pluginutils': 4.2.1 + chokidar: 3.5.3 + debug: 4.3.4 + fast-glob: 3.2.12 + local-pkg: 0.4.2 + magic-string: 0.26.4 + minimatch: 5.1.0 + resolve: 1.22.1 + unplugin: 0.9.6 + vue: 3.2.39 + transitivePeerDependencies: + - supports-color + dev: true + + /unplugin/0.9.6: + resolution: {integrity: sha512-YYLtfoNiie/lxswy1GOsKXgnLJTE27la/PeCGznSItk+8METYZErO+zzV9KQ/hXhPwzIJsfJ4s0m1Rl7ZCWZ4Q==} + dependencies: + acorn: 8.8.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.4.5 + dev: true + /update-browserslist-db/1.0.4_browserslist@4.21.1: resolution: {integrity: sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==} hasBin: true @@ -3857,6 +3959,15 @@ packages: engines: {node: '>=12'} dev: true + /webpack-sources/3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack-virtual-modules/0.4.5: + resolution: {integrity: sha512-8bWq0Iluiv9lVf9YaqWQ9+liNgXSHICm+rg544yRgGYaR8yXZTVBaHZkINZSB2yZSWo4b0F6MIxqJezVfOEAlg==} + dev: true + /whatwg-encoding/2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} diff --git a/tests/components/AutoImportScriptSetup.vue b/tests/components/AutoImportScriptSetup.vue new file mode 100644 index 000000000..e01a208e4 --- /dev/null +++ b/tests/components/AutoImportScriptSetup.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/tests/mountingOptions/global.stubs.spec.ts b/tests/mountingOptions/global.stubs.spec.ts index 403911eab..f7534b0f6 100644 --- a/tests/mountingOptions/global.stubs.spec.ts +++ b/tests/mountingOptions/global.stubs.spec.ts @@ -6,6 +6,7 @@ import Hello from '../components/Hello.vue' import ComponentWithoutName from '../components/ComponentWithoutName.vue' import ComponentWithSlots from '../components/ComponentWithSlots.vue' import ScriptSetupWithChildren from '../components/ScriptSetupWithChildren.vue' +import AutoImportScriptSetup from '../components/AutoImportScriptSetup.vue' describe('mounting options: stubs', () => { let configStubsSave = config.global.stubs @@ -393,6 +394,17 @@ describe('mounting options: stubs', () => { ) }) + it('stubs a script setup component imported by unplugin-vue-components', () => { + const wrapper = mount(AutoImportScriptSetup, { + global: { + stubs: { + ScriptSetup: true + } + } + }) + expect(wrapper.html()).toBe(``) + }) + describe('transition', () => { it('stubs transition by default', () => { const CompStubbedByDefault = { diff --git a/vitest.config.ts b/vitest.config.ts index d02490881..5417160f9 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,9 +2,18 @@ import path from 'path' import { defineConfig } from 'vitest/config' import vue from '@vitejs/plugin-vue' import jsx from '@vitejs/plugin-vue-jsx' +import Components from 'unplugin-vue-components/vite' export default defineConfig({ - plugins: [vue(), jsx()], + plugins: [ + vue(), + jsx(), + Components({ + dts: false, + include: /AutoImportScriptSetup\.vue$/, + dirs: ['tests/components'] + }) + ], define: { __USE_BUILD__: process.env.NODE_ENV !== 'test-build', __BROWSER__: true, From 8d32c4d0ec38acb9a4e134f94b3c02ca0a89b978 Mon Sep 17 00:00:00 2001 From: Emma <1285641941@qq.com> Date: Sun, 25 Sep 2022 20:20:55 +0800 Subject: [PATCH 3/4] fix: add necessary comments --- package.json | 2 +- src/utils/componentName.ts | 3 +++ vitest.config.ts | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 037cbb1cb..a321a493e 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "rollup-plugin-typescript2": "0.34.0", "tslib": "2.4.0", "typescript": "4.8.3", - "unplugin-vue-components": "^0.22.7", + "unplugin-vue-components": "0.22.7", "vite": "3.1.3", "vitepress": "0.22.4", "vitest": "0.22.1", diff --git a/src/utils/componentName.ts b/src/utils/componentName.ts index 26b453279..318e0ed81 100644 --- a/src/utils/componentName.ts +++ b/src/utils/componentName.ts @@ -39,6 +39,9 @@ export const getComponentName = ( ): string => { if (isObjectComponent(type)) { return ( + // If the component we stub is a script setup component and is automatically + // imported by unplugin-vue-components we can only get its name through + // the `__name` property. getComponentNameInSetup(instance, type) || type.name || type.__name || '' ) } diff --git a/vitest.config.ts b/vitest.config.ts index 5417160f9..7aa625d69 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -8,6 +8,9 @@ export default defineConfig({ plugins: [ vue(), jsx(), + // We need this plugin to test for stubbing a script setup component + // imported by it. + // https://github.com/antfu/unplugin-vue-components/issues/429 Components({ dts: false, include: /AutoImportScriptSetup\.vue$/, From 14bb306367178f7a105ce4c28af01989ebb2d847 Mon Sep 17 00:00:00 2001 From: Emma <1285641941@qq.com> Date: Sun, 25 Sep 2022 22:54:52 +0800 Subject: [PATCH 4/4] chore: update lockfile --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e80edb900..b41509431 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,7 @@ specifiers: rollup-plugin-typescript2: 0.34.0 tslib: 2.4.0 typescript: 4.8.3 - unplugin-vue-components: ^0.22.7 + unplugin-vue-components: 0.22.7 vite: 3.1.3 vitepress: 0.22.4 vitest: 0.22.1