unplugin-vue-components: Intellisense does not work for auto-imported components
Describe the bug
When I hover over an auto-imported component, intellisense does not work. There is no information about the imported component in the modal that opens up:

After a lot of experimentation, I noticed that this only occurs when the module name in the auto-generated components.d.ts
file is @vue/runtime-core
.

If I change the module name from @vue/runtime-core
to vue
, intellisense works!
The problem is that manually changing the module name is not sustainable. Whenever unplugin-vue-components
detects a new component in my components’ directory, it updates the components.d.ts
file and changes the declared module name back to @vue/runtime-core
.
Why does changing the module name restore intellisense support?
Is there any way to configure unplugin-vue-components
to name the declared module vue
instead of @vue/runtime-core
?
I’m really confused by this bug. All help is appreciated.
Thank you for reading! ❤️
PS: I have version 0.39.2 of Vue Language Features (Volar) installed.
Reproduction
https://github.com/mareszhar/demo-imifcaiwuvc-mrfi
System Info
System:
OS: macOS 12.4
CPU: (10) arm64 Apple M1 Pro
Memory: 314.05 MB / 16.00 GB
Shell: 5.8.1 - /bin/zsh
Binaries:
Node: 16.16.0 - /usr/local/bin/node
npm: 8.15.1 - /usr/local/bin/npm
Browsers:
Chrome: 103.0.5060.134
Firefox Developer Edition: 102.0
Safari: 15.5
Used Package Manager
pnpm
Validations
- Follow our Code of Conduct
- Read the Contributing Guide.
- Check that there isn’t already an issue that reports the same bug to avoid creating a duplicate.
- Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
- The provided reproduction is a minimal reproducible of the bug.
About this issue
- Original URL
- State: open
- Created 2 years ago
- Reactions: 1
- Comments: 16 (1 by maintainers)
Thank you @Sight-wcg for the pointers!
I’ll summarize the answers in English here for others who might be facing the same issue:
The problem occurs in the automatically generated
components.d.ts
file, where the module with the auto-imported component types is declared as@vue/runtime-core
. Intellisense is lost becausepnpm
can only access a project’s top-level dependencies, and@vue/runtime-core
is a dependency nested inside thevue
module (that is, not a top dependency). So, the declaration fails.There are several ways to solve this issue:
.npmrc
file in your directory’s root, and add this line in it:public-hoist-pattern[]=@vue/runtime-core
.npmrc
file in your directory’s root, and add this line in it:shamefully-hoist=true
(Doing this will make all nested dependencies available as top-level dependencies)pnpm add @vue/runtime-core -D
to add the nested module as a top-level dependency. (You must ensure the version of @vue/runtime-core matches the version of Vue installed in your project.)0.18.5
ofunplugin-vue-components
instead of the latest version. (Works because up to this version unplugin-vue-components declared the module in components.d.ts as ‘vue’. The downside is that you’ll miss out on the latest updates and improvements to the plugin.)components.d.ts
todeclare module 'vue'
instead ofdeclare module '@vue/runtime-core'
(Inconvenient because you’ll have to update the module name whenever unplugin-vue-components automatically generates a new components.d.ts file and overwrites your changes.)If you chose option 1 or 2 and created the
.npmrc
file, runpnpm i
afterwards to update your node_modules with the latest config. Then, reload your workspace. Intellisense for auto-imported components should be working again.Maybe solution 1 should be added to the plugin docs?
PS: Credits to wangyu-personal and loosheng for their answers in the related threads.
https://github.com/antfu/unplugin-vue-components/issues/389 https://github.com/antfu/unplugin-vue-components/issues/406
@mareszhar I watched your repository, you used typescript. add
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "components.d.ts"],
on tsconfig.json. Personally I think u missedcomponents.d.ts
@ThaDaVos Correct, that’s the same intellisense preview I see of the
HelloWorld
component. I agree, it’s inconvenient that doingctrl/cmnd + click
to the component doesn’t take you to the component’s file, but rather to its type definition incomponents.d.ts
, but at least you can see its relative path there if you need to find it among many other components. Hopefully in the future, there’s better navigation support for auto-imported components.I had trouble with this too. I tried options 1, 3, 4, and 5 from this comment, no luck. I specifically had trouble with getting type-checking on inline functions within a
v-on
property. So something like thiswould give me
Parameter 'someParam' implicitly has an 'any' type.ts(7006)
even though I have this param defined within the component correctly.I can verify that the auto-import is the problem because if I simply import the component
MyComponent
(don’t depend on auto-importing), type checking kicks in correctly andsomeParam
would be defined to whatever type I have it set as withinMyComponent
.Please let me know if there is a fix for this issue or if I have something messed up on my end.