From a14eb6cba0170454c4a3ae6cb6a98c1e2268c426 Mon Sep 17 00:00:00 2001 From: Carson McManus Date: Fri, 27 Feb 2026 12:14:17 -0500 Subject: [PATCH] fix(noVueDuplicateKeys): fix false positives when keys are defined in `watch` --- .changeset/quick-hands-show.md | 5 ++++ .../lint/correctness/no_vue_duplicate_keys.rs | 4 ++- .../noVueDuplicateKeys/valid-watch.vue | 25 +++++++++++++++++ .../noVueDuplicateKeys/valid-watch.vue.snap | 27 +++++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 .changeset/quick-hands-show.md create mode 100644 crates/biome_js_analyze/tests/specs/correctness/noVueDuplicateKeys/valid-watch.vue create mode 100644 crates/biome_js_analyze/tests/specs/correctness/noVueDuplicateKeys/valid-watch.vue.snap diff --git a/.changeset/quick-hands-show.md b/.changeset/quick-hands-show.md new file mode 100644 index 000000000000..095bc27a70fe --- /dev/null +++ b/.changeset/quick-hands-show.md @@ -0,0 +1,5 @@ +--- +"@biomejs/biome": patch +--- + +Fixed [#9250](https://github.com/biomejs/biome/issues/9250): `noVueDuplicateKeys` will no longer flag keys under `watch`, preventing false positives. diff --git a/crates/biome_js_analyze/src/lint/correctness/no_vue_duplicate_keys.rs b/crates/biome_js_analyze/src/lint/correctness/no_vue_duplicate_keys.rs index 903e1207672b..16a461c9f69b 100644 --- a/crates/biome_js_analyze/src/lint/correctness/no_vue_duplicate_keys.rs +++ b/crates/biome_js_analyze/src/lint/correctness/no_vue_duplicate_keys.rs @@ -138,7 +138,9 @@ impl Rule for NoVueDuplicateKeys { let mut key_declarations: FxHashMap> = FxHashMap::default(); // Collect all declarations across all Vue component sections - for declaration in component.declarations(VueDeclarationCollectionFilter::all()) { + for declaration in component.declarations( + VueDeclarationCollectionFilter::all() ^ VueDeclarationCollectionFilter::Watcher, + ) { if let Some(name) = declaration.declaration_name() { // Handle cases like `const { foo } = defineProps(...);`. if let VueDeclaration::Setup(ref setup_decl) = declaration diff --git a/crates/biome_js_analyze/tests/specs/correctness/noVueDuplicateKeys/valid-watch.vue b/crates/biome_js_analyze/tests/specs/correctness/noVueDuplicateKeys/valid-watch.vue new file mode 100644 index 000000000000..6aff95ac0ee4 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/correctness/noVueDuplicateKeys/valid-watch.vue @@ -0,0 +1,25 @@ + + + diff --git a/crates/biome_js_analyze/tests/specs/correctness/noVueDuplicateKeys/valid-watch.vue.snap b/crates/biome_js_analyze/tests/specs/correctness/noVueDuplicateKeys/valid-watch.vue.snap new file mode 100644 index 000000000000..8ae731892fc6 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/correctness/noVueDuplicateKeys/valid-watch.vue.snap @@ -0,0 +1,27 @@ +--- +source: crates/biome_js_analyze/tests/spec_tests.rs +expression: valid-watch.vue +--- +# Input +```ts + export default { + name: 'QFormContainer', + props: { + formData: { + type: Object, + default: () => ({}), + validator: (val) => true + }, + }, + watch: { + formData: { + handler(newValue) + { + //do things + }, + deep: true + } + } + } + +```