Who Called Me? – Vue & Blade Usages
Discover where Vue components and Laravel Blade templates are used, then navigate back to their source without changing VS Code's Search view.
Vue components
Given UserProfileCard.vue, the extension searches for:
<UserProfileCard ...>
<user-profile-card ...>
UserProfileCard script references, including imports and component registration
- Quoted
"user-profile-card" references, including dynamic component names
- Aliased imports such as
import DifferentName from './UserProfileCard.vue'
- Aliases generated in
components.d.ts
- Explicit component names declared with
defineOptions or export default
Results open in VS Code's Peek References panel, grouped by file. The workspace Search view and its current query, include and exclude settings are not changed.
Commented-out code is ignored by default, closing tags are not counted, and repeated matches on one line produce one concise result.
After activation, the extension quietly builds a reverse usage index in the background. Searches use that index to run the detailed matcher only against candidate files instead of scanning the whole workspace. Later searches also reuse a bounded in-memory cache of decoded contents, comment-masked contents and completed lookups.
VS Code file events remove stale index and cache entries automatically. Only edited, created or renamed files need to be indexed again. If a search is started before the initial background index is ready, that search waits for the one-time index build to finish. The index and cache are not written into the workspace and are discarded when the extension host closes.
Unlike extensions limited to Vue and TypeScript globs, the default scope also finds component tags embedded in Blade, PHP, Markdown and other text-based files.
Run Who Called Me?: Clear Workspace Cache from the Command Palette whenever you want to discard it manually.
Go to component definition
Hold Cmd and click a component tag on macOS, or hold Ctrl and click on Windows and Linux, to open its .vue source file. Both opening and closing tags are supported.
You can also right-click a tag and select Go to Component Definition.
Definition resolution checks, in order:
- Default, async and locally registered import aliases in the current file.
- Global aliases generated in
components.d.ts.
- PascalCase, kebab-case, filename and
index.vue folder conventions.
- Explicit names declared through
defineOptions or export default.
If more than one component matches, VS Code displays its normal definition picker rather than choosing an arbitrary file.
Blade templates
Right-click a .blade.php file in the Explorer, open editor or editor tab and select Find Blade Template Usages. A Blade template stored at resources/views/admin/profile.blade.php is resolved as admin.profile.
The extension finds the view in:
@include, @includeIf, @includeWhen, @includeUnless, @includeFirst, @each, @extends and @component
view(), View::make(), View::first(), View::exists(), view composers and creators
Route::view()
- Mailable
view, html, text and markdown templates
- Legacy
Mail::send(), Mail::queue() and Mail::later() calls
- Fluent
->view(), ->markdown(), ->text(), ->html() and ->render() calls
assertViewIs() assertions
- Anonymous component tags such as
<x-alert> and nested tags such as <x-forms.input>
- Static
<x-dynamic-component component="alert"> usages
Blade view names written with slash notation are supported alongside Laravel's normal dot notation. Templates under resources/views/vendor/package are also checked using package::view namespace notation.
Anonymous Blade component tags support native Cmd+Click / Ctrl+Click navigation to templates under resources/views/components.
Vue usage
Right-click a .vue file in any of these places:
- The Explorer
- The open editor
- The editor tab
Then select Find Vue Component Usages.
You can also run Who Called Me?: Find Vue Component Usages from the Command Palette while a .vue file is active.
Every Vue file has a lightweight CodeLens. Blade templates have the same shortcut, labelled Find template usages. Each displays the cached usage count after a lookup, and the editor title includes a references button for the same action.
For index.vue, the parent directory name is used by default. For example, UserCard/index.vue is treated as UserCard and <user-card>.
Settings
whoCalledMe.filesToInclude: optional glob limiting the files scanned. It is empty by default, so all workspace files are considered.
whoCalledMe.filesToExclude: glob excluding dependency, version-control and generated folders from the scan.
whoCalledMe.cacheEnabled: reuse workspace file contents and completed lookups in memory. Defaults to true.
whoCalledMe.maxCacheSizeMegabytes: approximate memory limit for cached file contents. Defaults to 128 MB.
whoCalledMe.indexOnStartup: quietly build the reverse usage index after activation. Defaults to true.
whoCalledMe.includeScriptReferences: include identifiers and quoted names as well as template tags. Defaults to true.
whoCalledMe.searchInComments: include commented-out usages. Defaults to false.
whoCalledMe.useParentDirectoryForIndexFiles: use the parent folder as the component name for index.vue. Defaults to true.
whoCalledMe.maxFileSizeKilobytes: skip individual files larger than this size. Defaults to 2048 KB.
whoCalledMe.maxResults: maximum number of results shown. Defaults to 2000.
whoCalledMe.scanComponentsDts: resolve generated global aliases from components.d.ts. Defaults to true.
whoCalledMe.componentsDtsGlob: glob used to locate generated component declaration files.
whoCalledMe.codeLens: show the cached usage-count CodeLens. Defaults to true.
whoCalledMe.definitionGlob: glob used to locate .vue component source files.
whoCalledMe.maxDefinitionFiles: maximum number of files considered when resolving definitions. Defaults to 12000.
whoCalledMe.bladeViewRoots: workspace-relative Laravel view roots. Defaults to resources/views.
whoCalledMe.bladeDefinitionGlob: glob used to locate anonymous Blade component templates.
Limitations
This is a workspace text scan rather than a language server. Direct import, registration and components.d.ts aliases are resolved, but aliases hidden behind complex barrel-file re-exports may not be discoverable automatically. Components with identical names in different folders can still share filename-based results when they are used globally without an import. Dynamic Blade view names assembled from variables cannot be resolved until they appear as a literal view name.