GitShow/vuejs/language-tools
vuejs

language-tools

⚡ High-performance Vue language tooling based-on Volar.js

by vuejs
Star on GitHubForkWebsitenpm

TypeScript

6.7k stars560 forks194 contributorsActive · 23m agoSince 2020v3.3.11MIT

Meet the team

See all 194 on GitHub →
johnsoncodehk
johnsoncodehk4.9k contributions
KazariEX
KazariEX553 contributions
github-actions[bot]Bot
github-actions[bot]104 contributions
so1ve
so1ve91 contributions
serkodev
serkodev40 contributions
zhiyuanzmj
zhiyuanzmj28 contributions
kermanx
kermanx13 contributions
yaegassy
yaegassy12 contributions

Languages

View on GitHub →
TypeScript87.4%
Vue10.9%
JavaScript1.5%
HTML0.1%

Commit activity

Last 12 weeks · 80 commits

Full graph →

Community health

2 of 6 standards met

Community profile →
37
✓README✓License○Contributing○Code of Conduct○Issue Template○PR Template

Recent PRs & issues

Active · Last activity 23m ago
See all on GitHub →
johnsoncodehk
refactor(language-core): unwrap setup bindings by valueOpenPR

Problem For every `.valueasserts__VLS_withDotValue.valuefoo.value()TS2339: Property 'value' does not exist on type '() => void'&&??v-elsefor...ofv-forvalueexactType(box2.value)number`).

johnsoncodehk · 23m ago
johnsoncodehk
Rename at a shared source boundary executes at two generated positions when unmapped text is injected between chunksOpenIssue

Problem Source mappings are closed intervals: when two mapped chunks are adjacent in the source, the shared source offset is claimed by both the preceding chunk's end and the following chunk's start. As long as the two chunks are also adjacent in the generated code, both claims resolve to the same generated position and the double-claim is harmless. But when unmapped text is injected between the two chunks in the generated code, the shared boundary resolves to two disjoint generated positions. Rename (and similar position-driven features) then executes at both positions — and the first one lands on whatever the injected text contains. Concrete case (surfaced by #6184) #6184 emits setup-binding reads as — an unmapped prefix immediately before the mapped chunk: Renaming at its left boundary () resolves the source offset at two generated positions: 1. the end of the preceding chunk → lands on the identifier, 2. the start of the binding chunk → lands on (the intended one). Since is declared in a real file (), the rename produces an edit that renames the helper declaration itself — user code ends up rewriting library internals. This already exists on master — it is just invisible The same double-claim mechanism exists on master via the path (options API / undeclared bindings), where generated code is e.g. . Renaming at the same boundary position additionally targets — but is a virtual-unmapped synthetic variable, so its edits cannot map back to the source and are silently dropped. Verified locally: on an options-API component produces clean rename locations only because the extra edits are discarded. On master, setup bindings are emitted as / bare with no injected text between adjacent chunks, so the double-claim resolves to a single position there as well. Where the fix belongs Not in codegen. Any codegen-side workaround (detaching boundary characters, reshaping chunks) trades one mapping ambiguity for another. The fix belongs at the position-translation / rename layer: when a source position maps to multiple generated positions because of a boundary double-claim, rename should recognize that the extra positions come from the same shared boundary — or simply not execute rename at a generated position that the user could not have intended (e.g. positions claimed only via the end edge of a mapping while another claim via the start edge exists). Upstream Volar.js may be the right place. Reproduction 1. Check out #6184. 2. Open a `const foo = 1{{ foo +foo }}foofoopackages/language-core/types/template-helpers.d.ts__VLS_unwrap` declaration).

johnsoncodehk · 7h ago
ludwig801
Generics with default value narrows union to defaultOpenIssue

Vue - Official extension or vue-tsc version 3.3.11 VSCode version 1.127.0 Vue version 3.5.27 TypeScript version 5.9.3 Steps to reproduce Create a simple file with a generic declaration. Notice the default value for , which is the important part. What is expected? When using the component, it is expected that vscode would suggest or as valid values for the prop when autocompleting. What is actually happening? When using the component, it only suggests the default for the prop. Link to minimal reproduction _No response_ Any additional comments? I think it is important to mention that it no longer happens using Typescript 6.x.x. I haven't updated my project to TS 6.x.x because of some other issues. If you tell me that this is due to a TS limitation and not due to any internal issue, please disregard this bug.

ludwig801 · 22h ago

Recent fixes

View closed PRs →
lorzl
[Feature] Option to not pre-activate the Vue language server (memory saving for occasional Vue users)ClosedIssue

[Feature] Option to not pre-activate the Vue language server (memory saving for occasional Vue users) What problem does this feature solve? The Vue extension activates via the bare activation event, which (as explained in #5588) is intentional: it ensures the extension activates before the TypeScript extension so it can take over the TS language service. As a result, Volar activates as soon as any language file is opened — even in workspaces that never contain a single file. For users who work with Vue only occasionally (e.g. most of the time in TS/JS or other projects), this means: A dedicated TypeScript server process (spawned with ) plus the extension host footprint stay resident for the whole session Measured on my machine (VS Code 1.102, Vue - Official 3.3.11, a non-Vue workspace): ~365 MB of resident memory across Volar's processes, with zero Vue files ever opened I fully understand why is used, and it should stay the default. This request is not about changing the default — it's about giving occasional Vue users a choice, since 300+ MB is significant on memory-constrained machines. What does the proposed solution look like? Add a boolean setting (e.g. ), default so existing behavior is unchanged: (default): current behavior — bare pre-activation, activates before TS, zero change for existing users. : do not start the Vue language server on activation (skip forking tsserver; the biggest memory chunk is freed). When the user then opens a file, show a one-time prompt to restart the extension host to enable Vue features — reusing the prompt-based restart pattern already introduced in #5588. Implementation note: in the manifest are static and cannot be switched at runtime, so the manifest can keep the bare . The setting would only be checked inside to decide whether to boot the language server — the default path stays identical, only opt-out users are affected. Related: #5588 (why is used), #5544 (extension host restart impact on other extensions). I searched existing issues (, , ) and found no duplicate request.

lorzl · 1d ago
johnsoncodehk
fix(language-core): support calling template bindings without .valueMergedPR

Problem Template expressions that reference a setup binding (a "maybe ref" — could be a or a plain value) used to always append and lean on to justify it. That assertion is a no-op for function declarations: does not add to a function, so a function binding became → TS2339 on an unmapped region → silently dropped, and the call was never type-checked. Solution now propagates a call position through the callee subtree. A binding that is being called no longer gets , whether the callee is a direct identifier (), grouped (), a logical/binary operand (), a conditional branch, a type assertion, or a tagged-template tag (`x.value__VLS_withDotValueT & { value: T }TT & V{} as Ref{} as Refvalue: anytest-workspace/tsc/withDotValue@click{{ }}ref(fn)foo(bar){ foo: bar }.valuebarwithDotValue.value__VLS_unwrap(...).valuewithDotValuev-ifv-model`) is required.

johnsoncodehk · 1d ago
Structured data for AI agents

Repository: vuejs/language-tools. Description: ⚡ High-performance Vue language tooling based-on Volar.js Stars: 6714, Forks: 560. Primary language: TypeScript. Languages: TypeScript (87.4%), Vue (10.9%), JavaScript (1.5%), HTML (0.1%). License: MIT. Homepage: https://deepwiki.com/vuejs/language-tools Latest release: v3.3.11 (5d ago). Open PRs: 14, open issues: 13. Last activity: 23m ago. Community health: 37%. Top contributors: johnsoncodehk, KazariEX, github-actions[bot], so1ve, serkodev, zhiyuanzmj, kermanx, yaegassy, IIFelix, dependabot[bot] and others.

·@ofershap

Replace github.com with gitshow.dev