$ the-wire · showcase
vueCompilerOptions.plugins now overrides, not merges
By RepoJournal · Filed · About Vue.js · Composed from the cited sources · methodology
The language-tools desk landed two fixes that change resolved TypeScript behavior for Vue projects: plugin lists in an extends chain now replace rather than accumulate, and union-typed props survive withDefaults.
fix(language-core): override vueCompilerOptions.plugins instead of merging vuejs/language-tools
A tsconfig that sets vueCompilerOptions.plugins now replaces the inherited list instead of merging into it, matching how extends treats other array options. Configs that never declare plugins are unaffected, and [] clears inherited plugins, so a base config plus a local plugin means listing both yourself.
fix(language-core): keep union props when using withDefaults (#6180) vuejs/language-tools
withDefaults(defineProps<A | B>()) used to emit DefineSetupFnComponent<Record<string, any>>: the homomorphic mapped type distributed __VLS_TypePropsToOption over the union, so defineComponent saw two incompatible runtime props objects and fell back to the setup overload. A non-homomorphic remap keeps the runtime props a single object.
fix(language-core): deduplicate vueCompilerOptions.plugins on resolve vuejs/language-tools
In extends chains such as Nuxt monorepos with shared layers, the same plugin entry could be registered more than once because CompilerOptionsResolver.addConfig() appended every resolved module while template compilation only consumed the first plugin returning a result, so a stale workspace copy of something like @vue/language-plugin-pug could win. Plugin resolution now deduplicates.
Action items
- → Audit tsconfigs that add vueCompilerOptions.plugins on top of a base config and list inherited plugins explicitly, si... vuejs/language-tools [plan]