ShopperCove
Menu
All writingBlogTopicsCategoriesAboutRSS
Blog
Categories
Observability & SRE62All categories
Topics
sre111localhost lab102performance70python58javascript47bundle size36benchmarking35node.js35web development21typescript19benchmark16content creation15All topics
About
Loading article…

ShopperCove

Hands-on notes on developer tools, written after the tool has actually been run.

All writingBlogCategoriesTopicsAboutPrivacyRSS

© 2026 ShopperCove

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

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

  • 01registry.npmjs.org/vue-tsc/3.3.12
  • 02github.com/vuejs/language-tools
  • 03github.com/vuejs/language-tools/blob/master/CHANGELOG.md
  • 04vuejs.orghttps://vuejs.org/

Related

  • 01shoppercove.com/blog/oxlint-1-87-react-suggestions-a11y-fixes-october-2026
  • 02shoppercove.com/blog/biome-2-5-15-type-inference-nursery-rules-october-2026
  • 03shoppercove.com/blog/eslint-10-12-release-october-2026
  • 04shoppercove.com/blog/typescript-eslint-8-71-no-unsafe-enum-assignment-october-2026
  • 05shoppercove.com/blog/vite-plus-1-0-unified-toolchain-october-2026
  • 06shoppercove.com/blog/rspack-2-2-8-resolver-cache-memory-october-2026
  • 07shoppercove.com/blog/bun-1-4-2-elysia-als-cmyk-jpeg-october-2026
  • 08shoppercove.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.

Keep reading

  • oxc-parser vs @babel/parser: 9.1 ms vs 47.9 ms on 513 KB

    Hands-on6 Oct 20268 min read

  • Shiki vs Prism.js: 72 KB vs 8 KB, 36 ms vs 3 ms

    Hands-on6 Oct 20266 min read

  • smol-toml vs @iarna/toml: 3x Faster on Deno Cargo

    Hands-on6 Oct 20265 min read