ShopperCove
Menu
All writingBlogTopicsCategoriesAboutRSS
Blog
Categories
Observability & SRE62All categories
About

Plate 33

  1. Blog

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 Challa·5 October 2026·4 min read

Summary
On this page
  1. Should you upgrade to vue-tsc 3.3.12?
  2. What actually shipped (2 Oct 2026)
  3. language-core
  4. Other packages
  5. ShopperCove smoke test: 3.3.12 vs 3.3.11
  6. How to fix TS2300 Duplicate identifier \$style
  7. Upgrade checklist
  8. Bottom line
  9. Sources
  10. Related

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.plugins now 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.

Fixture3.3.113.3.12
Two <style module> blocks both defining .a0 diagnosticsTS2300 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

  1. Search the SFC for more than one <style module> (or <style module="…">) block that both inject $style.
  2. Merge into a single <style module> block, or give modules distinct names and stop relying on the default $style binding for both.
  3. Re-run vue-tsc --noEmit on the branch after pinning 3.3.12.
  4. Expect tighter defineModel default-factory typing next—fix props.missing-style typos the new inference catches.
  5. If you open untrusted .vue files in the editor, note the security hardening around untrusted SFCs.

Upgrade checklist

  1. Pin vue-tsc@3.3.12 (and matching Vue Language Tools / Volar build) on a branch.
  2. Run vue-tsc --noEmit across the app. Expect new diagnostics on duplicate CSS module names and tighter defineModel default-factory typing.
  3. If watch-mode vue-tsc used to crash on incremental rebuilds, re-test after the bump (a59da36).
  4. 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
vue-tsctypescriptvuets2300css modulesdefinemodelvolar

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.

Notes when a lab post goes up

Occasional email for new hands-on reviews. No sequence and no sponsors.

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

On this page

  1. Should you upgrade to vue-tsc 3.3.12?
  2. What actually shipped (2 Oct 2026)
  3. language-core
  4. Other packages
  5. ShopperCove smoke test: 3.3.12 vs 3.3.11
  6. How to fix TS2300 Duplicate identifier \$style
  7. Upgrade checklist
  8. Bottom line
  9. Sources
  10. Related
All writingBlogCategoriesTopicsAboutPrivacyRSS

© 2026 ShopperCove