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.
4 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.
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).
defineModel (1be73b8)withDefaults; keep inference-only props strings single-line with block comments.valuevueCompilerOptions.plugins now overrides the inherited list instead of being deduplicated on resolve.d.tsOn 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.
<style module> (or <style module="…">) block that both inject $style.<style module> block, or give modules distinct names and stop relying on the default $style binding for both.vue-tsc --noEmit on the branch after pinning 3.3.12.defineModel default-factory typing next—fix props.missing-style typos the new inference catches..vue files in the editor, note the security hardening around untrusted SFCs.vue-tsc@3.3.12 (and matching Vue Language Tools / Volar build) on a branch.vue-tsc --noEmit across the app. Expect new diagnostics on duplicate CSS module names and tighter defineModel default-factory typing.vue-tsc used to crash on incremental rebuilds, re-test after the bump (a59da36).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.
Lab evidence
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.