Plate 33
vue-tsc 3.3.12 TS2300 Duplicate $style: Should You Upgrade?
vue-tsc / Vue Language Tools 3.3.12 (2 Oct 2026): ShopperCove reproduced TS2300 "Duplicate identifier $style" on a two-<style module> fixture—absent on 3.3.11. Also: defineModel default-factory typing, untrusted SFC hardening, template .value call fix. Upgrade decision for Vue teams. No affiliate.
Aditya Challa4 min read
No affiliate links. After I upgraded a scratch project to vue-tsc 3.3.12, a fixture with two <style module> blocks both defining .a threw TS2300 Duplicate identifier '$style'—the same file on 3.3.11 showed 0 diagnostics. This post is the upgrade decision for Vue teams: when that new diagnostic (and the rest of Vue Language Tools v3.3.12 / npm vue-tsc@3.3.12) is worth the bump, and how to fix the CSS-module clash. Nothing in ShopperCove’s production build was changed for this article.
Should you upgrade to vue-tsc 3.3.12?
Yes if you use multiple <style module> blocks in one SFC, typed defineModel default factories, or open untrusted .vue samples in the editor. Wait if you are mid-freeze on 3.3.11 with a clean typecheck and no CSS modules / defineModel factory edge cases—skim the release notes and pin when you next open a Vue branch.
npm published vue-tsc 3.3.12 at 2026-10-02T09:28:35Z (14:58 IST). The GitHub release tag went up at 16:54 UTC the same day (22:24 IST).
What actually shipped (2 Oct 2026)
language-core
- security: improved handling of untrusted Vue files (cea0698)
- feat: infer the first parameter type of the default factory for
defineModel(1be73b8) - feat: report duplicate CSS module names, including non-identifier names
- fix: keep union props when using
withDefaults; keep inference-only props strings single-line with block comments - fix: support calling template bindings without
.value - fix: pad directive hook signatures for short-arity directive bindings;
vueCompilerOptions.pluginsnow overrides the inherited list instead of being deduplicated on resolve - fix: eliminate synthesized ignore comments across codegen / scoped class aliases / compound handlers; correct template mapping boundaries; stop typedef JSDoc leaking into emitted
.d.ts - perf: precompile attribute glob matchers
Other packages
- component-meta: stop checking JS Vue files as TS
- typescript-plugin: don’t abort reference span fix-up on style-less files
- tsc: prevent watch-mode crash on incremental build
- vscode: reduce focus-mode overhead
ShopperCove smoke test: 3.3.12 vs 3.3.11
On 5 Oct 2026 we installed vue-tsc@3.3.12 and vue-tsc@3.3.11 (with vue@3.5 and typescript@5.9) in separate scratch folders and ran vue-tsc --noEmit.
| Fixture | 3.3.11 | 3.3.12 |
|---|---|---|
Two <style module> blocks both defining .a | 0 diagnostics | TS2300 Duplicate identifier '$style' (twice) |
defineModel({ default: (props: { count: number }) => props.missing }) | (not compared) | TS2339 on missing — factory param typing holds |
Template {{ fn() }} where fn = ref(() => 1) | (clean on both in our run) | No forced .value error (matches the 7ad4a94 fix) |
Treat this as one box’s smoke test, not a full regression suite. The duplicate CSS-module diagnostic is the clearest day-one reason to bump if you use multiple <style module> blocks in one SFC.
How to fix TS2300 Duplicate identifier $style
- Search the SFC for more than one
<style module>(or<style module="…">) block that both inject$style. - Merge into a single
<style module>block, or give modules distinct names and stop relying on the default$stylebinding for both. - Re-run
vue-tsc --noEmiton the branch after pinning 3.3.12. - Expect tighter
defineModeldefault-factory typing next—fixprops.missing-style typos the new inference catches. - If you open untrusted
.vuefiles in the editor, note the security hardening around untrusted SFCs.
Upgrade checklist
- Pin
vue-tsc@3.3.12(and matching Vue Language Tools / Volar build) on a branch. - Run
vue-tsc --noEmitacross the app. Expect new diagnostics on duplicate CSS module names and tighterdefineModeldefault-factory typing. - If watch-mode
vue-tscused to crash on incremental rebuilds, re-test after the bump (a59da36). - Extension installs: Open VSX Vue / volar returned 200 from this network on 5 Oct 2026.
Bottom line
Should you upgrade? If you ship Vue SFCs with CSS modules or typed defineModel factories, yes—ShopperCove’s DupCss fixture went from 0 diagnostics on 3.3.11 to TS2300 on 3.3.12, which is exactly the bug you want the compiler to catch before production. Pin, typecheck, fix the first $style clash, and skim the security note for untrusted SFCs. No affiliate.
Sources
- https://github.com/vuejs/language-tools/releases/tag/v3.3.12
- https://registry.npmjs.org/vue-tsc/3.3.12
- https://github.com/vuejs/language-tools
- https://github.com/vuejs/language-tools/commit/cea0698
- https://github.com/vuejs/language-tools/commit/1be73b8
- https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md
- https://open-vsx.org/extension/Vue/volar
- https://vuejs.org/
Related
- https://www.shoppercove.com/blog/oxlint-1-87-react-suggestions-a11y-fixes-october-2026
- https://www.shoppercove.com/blog/biome-2-5-15-type-inference-nursery-rules-october-2026
- https://www.shoppercove.com/blog/eslint-10-12-release-october-2026
- https://www.shoppercove.com/blog/typescript-eslint-8-71-no-unsafe-enum-assignment-october-2026
- https://www.shoppercove.com/blog/vite-plus-1-0-unified-toolchain-october-2026
- https://www.shoppercove.com/blog/rspack-2-2-8-resolver-cache-memory-october-2026
- https://www.shoppercove.com/blog/bun-1-4-2-elysia-als-cmyk-jpeg-october-2026
- https://www.shoppercove.com/blog/vite-8-3-2-renderbuilturl-bundled-dev-sourcemaps-october-2026
Lab evidence
What I found running this
Sources read 5 Oct 2026 (Asia/Calcutta): npm vue-tsc latest=3.3.12 published 2026-10-02T09:28:35.300Z (14:58 IST); GitHub release v3.3.12 published 2026-10-02T16:54:42Z (22:24 IST) by johnsoncodehk; release notes: security cea0698 untrusted Vue files; feat 1be73b8 defineModel default-factory first-param inference; feat d41d919/ffb85e5 duplicate CSS module names (incl. non-identifier); fixes for withDefaults union props, template bindings without .value (7ad4a94), directive hook arity, plugins override, template mapping, typedef JSDoc leak, watch-mode incremental crash (a59da36), vscode focus-mode perf. Hands-on on box: npm install vue-tsc@3.3.12 vue@3.5 typescript@5.9; vue-tsc --noEmit on fixtures — DupCss.vue (two <style module> blocks both defining .a) → TS2300 Duplicate identifier '$style' on 3.3.12; same fixture on vue-tsc@3.3.11 → 0 diagnostics. Demo.vue typed defineModel default factory flagged props.missing (TS2339). CallBind.vue calling a ref(()=>1) as fn() in template produced no .value error (7ad4a94). open-vsx.org/extension/Vue/volar GET 200; marketplace.visualstudio.com Vue.volar returned 404 from this network (not used as source). No ShopperCove production Vue app changed. CTR repackage 5 Oct 2026 evening: metaTitle question + TS2300 artifact in title/meta/first sentences. No affiliate.
Related links
Plate 05
oxfmt 0.72: native Markdown formatter, Prettier 3.9.9 parity test, sorted imports in code fences (5 Oct 2026)
oxfmt 0.72.0 (5 Oct 2026) swaps its Prettier-backed Markdown path for the native oxc_formatter_markdown (breaking). ShopperCove formatted 221 Markdown drafts with oxfmt 0.71.0, 0.72.0 and Prettier 3.9.9: byte-identical output, ~2 s vs ~16 ms. Plus opt-in import sorting inside code fences, the documented divergences, ignore-file and LSP fixes. No affiliate links.
5 Oct 2026
Plate 51
Biome 2.5.15: type-inference speedups, nursery rules, HTML formatter (30 Sep 2026)
Biome published @biomejs/biome@2.5.15 on 30 September 2026: type-inference and HTML formatter performance, plus nursery rules for React defaults, Svelte runes, logical CSS, and more. ShopperCove upgrade checklist only; no affiliate.
5 Oct 2026
Plate 78
oxlint 1.87.0: React suggestion fixes + jsx-a11y hardening (5 Oct 2026)
oxlint published v1.87.0 on 5 October 2026: suggestion support for three React/unicorn rules and jsx-a11y/label/mouse/lang hardening plus other fixes. npm latest 1.87.0 confirmed; ShopperCove docs checklist only; no affiliate.
5 Oct 2026