Skip to content

feat(biome_js_analyze): implement noVueRefAsOperand#9063

Merged
dyc3 merged 9 commits intobiomejs:mainfrom
taga3s:implement-noVueRefAsOperand
Feb 22, 2026
Merged

feat(biome_js_analyze): implement noVueRefAsOperand#9063
dyc3 merged 9 commits intobiomejs:mainfrom
taga3s:implement-noVueRefAsOperand

Conversation

@taga3s
Copy link
Copy Markdown
Contributor

@taga3s taga3s commented Feb 14, 2026

Summary

This PR ports noVueRefAsOperand from eslint-plugin-vue. It disallows the use of value wrapped by ref() as an operand because ref value must be accessed with .value.

Test Plan

I added tests based on the original: https://github.com/vuejs/eslint-plugin-vue/blob/4b92896b8da0720052547942abcdee200acad4ed/tests/lib/rules/no-ref-as-operand.js

Docs

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Feb 14, 2026

🦋 Changeset detected

Latest commit: e576dd0

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
Name Type
@biomejs/biome Patch
@biomejs/cli-win32-x64 Patch
@biomejs/cli-win32-arm64 Patch
@biomejs/cli-darwin-x64 Patch
@biomejs/cli-darwin-arm64 Patch
@biomejs/cli-linux-x64 Patch
@biomejs/cli-linux-arm64 Patch
@biomejs/cli-linux-x64-musl Patch
@biomejs/cli-linux-arm64-musl Patch
@biomejs/wasm-web Patch
@biomejs/wasm-bundler Patch
@biomejs/wasm-nodejs Patch
@biomejs/backend-jsonrpc Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions Bot added A-Project Area: project A-Linter Area: linter L-JavaScript Language: JavaScript and super languages A-Diagnostic Area: diagnostocis A-CLI Area: CLI labels Feb 14, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 14, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new Vue lint rule noVueRefAsOperand to the Biome JavaScript analyzer. The rule detects uses of ref-like values (e.g. ref, computed, toRef, toRefs, customRef, shallowRef, and compiler macros) used directly as operands without accessing .value. Implementation includes the lint declaration, rule state/options, semantic query unions, and diagnostics emission. A new rule options type/module and a changeset were added, along with numerous test specs (valid and invalid Vue SFCs) covering conditionals, logical/ternary/unary/binary operators, compound assignments, optional chaining, destructuring, static member access, and emits/defineEmits/defineModel/setup patterns.

Suggested labels

D-Vue

Suggested reviewers

  • ematipico
  • dyc3
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: implementing the noVueRefAsOperand lint rule for Biome's JavaScript analyzer.
Description check ✅ Passed The description clearly explains the PR's purpose, references the source rule, links the closed issue, and mentions the test plan based on the original eslint-plugin-vue tests.
Linked Issues check ✅ Passed The PR successfully implements the noVueRefAsOperand rule with comprehensive test coverage, matching all objectives from issue #6307 to port the vue/no-ref-as-operand rule into Biome's analyzer.
Out of Scope Changes check ✅ Passed All changes are scoped to implementing the noVueRefAsOperand rule: the lint rule implementation, options, tests, and necessary module declarations—no unrelated modifications present.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

🤖 Fix all issues with AI agents
In @.changeset/fair-parks-taste.md:
- Line 5: Fix the grammar in the changelog sentence for the rule name
noVueRefAsOperand by replacing "disallow" with "disallows" so the sentence reads
that the rule "disallows cases where a ref is used as an operand"; update the
text in the .changeset entry where the rule is described accordingly.

In `@crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs`:
- Around line 158-234: The match over parent.kind() in the function that checks
identifier usage (look for ident_expr, ident_binding, RuleState and the match
parent.kind() block) currently flags
if/switch/unary/binary/assignment/logical/conditional/template/static-member/call-argument
cases but misses loop-condition contexts; add JsSyntaxKind::JS_WHILE_STATEMENT,
JsSyntaxKind::JS_DO_WHILE_STATEMENT, and JsSyntaxKind::JS_FOR_STATEMENT as
additional arms (or include them with the existing JsSyntaxKind::JS_IF_STATEMENT
| JsSyntaxKind::JS_SWITCH_STATEMENT arm) so that those loop conditions return
Some(RuleState { range: ident_expr.range() }) just like the if/switch case.
- Around line 298-346: check_static_member_access incorrectly continues
validation after recognizing a valid toRefs access; modify it so when
ref_callee_name.text() == "toRefs" and
is_valid_static_member_wrapped_in_to_refs(...) returns true you immediately
return None (early exit) instead of falling through to is_valid_static_member.
Also fix is_valid_static_member_wrapped_in_to_refs: for the direct-ref case (the
branch that tries to validate refs.foo.value) advance one more parent hop before
extracting the member so you reach the outer "value" member (e.g., take
parent().parent() or get the parent as JsStaticMemberExpression of the outer
access) and then call .member().ok() and validate with is_valid_static_member;
keep the destructured-path behavior unchanged and continue to use
is_valid_static_member for the final check.

In
`@crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand/invalid-conditional-operators.vue`:
- Around line 1-5: This test file is missing the standard marker comment; add
the comment /* should generate diagnostics */ to the top of the test (inside the
file containing the <script> block) so the invalid case with the ref variable
foo used as an operand (foo in the var a = foo ? x : y expression) is recognized
as an expected-diagnostic test; ensure the comment appears where other invalid
tests place it (e.g., immediately before the offending code in the <script>
block).

In
`@crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand/invalid-defineemits.vue`:
- Around line 1-9: This file is missing the required test marker and uses the
wrong script type: add the comment "/* should generate diagnostics */" at the
top of the file and change the plain <script> block to a <script setup> block so
the compiler macro defineEmits is valid; ensure the refs/imports (ref,
defineEmits, count, update) remain unchanged so the test still triggers
diagnostics for using a Ref as an emit operand.

In
`@crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand/invalid-definemodel-destructured`
copy.vue:
- Around line 1-12: The test file name includes an accidental duplicate suffix "
copy" (invalid-definemodel-destructured copy.vue); rename the file to remove the
space and suffix (e.g., invalid-definemodel-destructured.vue) and update any
test-suite references/fixtures that import or enumerate that file so the test
runner sees the intended filename; ensure the test contents (the <script setup>
block and the describe/spec harness that expects this invalid case) remain
unchanged and run after the rename.

In
`@crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand/invalid-definemodel.vue`:
- Around line 3-11: The test uses the compiler macro defineModel() inside a
regular <script> block which is invalid; update the test so the macro is called
within a <script setup> block (move the existing let model = defineModel(); and
any top-level usage—e.g., console.log(model), the process() and update()
functions—into a <script setup>), or replace defineModel() with a non-macro stub
if you intend to keep a plain <script>; ensure defineModel() invocation and
related model assignment (in update) are located inside the <script setup>
context so the compiler macro is valid.

In
`@crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand/valid-definemodel-destructured.vue`:
- Line 1: The file valid-definemodel-destructured.vue contains a contradictory
top-line comment "/* should generate diagnostics */" — either change that
comment to "/* should not generate diagnostics */" to match the valid-* naming
or rename the file to invalid-definemodel-destructured.vue if it is intended to
produce diagnostics; update whichever you choose so test conventions (file
prefix and the top comment) are consistent with the intended test outcome.

In
`@crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand/valid-ignore-cases.vue`:
- Around line 34-43: The file defines const foo4 twice (shallowRef({}) and
ref(0)), causing a duplicate declaration SyntaxError; rename one of the
identifiers (e.g., change the second foo4 to foo5) everywhere it’s used in the
snippet (references in tag`${foo4}` or any subsequent use) so each const
(shallowRef and ref) has a unique name and the test remains valid.
🧹 Nitpick comments (4)
crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs (4)

269-282: Consider returning bool instead of Option<bool>.

is_calling_a_ref returns Option<bool>, and every call site does .is_some_and(|v| v) — effectively treating None and Some(false) identically. Returning bool (with the callee ? replaced by an early return Some(false) or using and_then internally) would simplify call sites from !is_calling_a_ref(...).is_some_and(|v| v) to just !is_calling_a_ref(...).


182-189: Fragile AST ancestry walk.

binding.declaration().syntax().grand_parent() assumes a fixed tree depth to reach JsVariableDeclaration. If the AST shape differs (e.g., TypeScript type-annotated destructuring), this could silently fail. Consider using .ancestors().find_map(JsVariableDeclaration::cast) — the same pattern you already use on line 144 — for consistency and robustness.

♻️ Suggested change
-                        if let Some(decl) = binding.declaration()
-                        && let Some(grand_parent) = decl.syntax().grand_parent()
-                        && matches!(grand_parent.kind(), JsSyntaxKind::JS_VARIABLE_DECLARATION)
-                        && let Some(decl) = grand_parent.cast::<JsVariableDeclaration>()
-                        && (decl.is_const()) {
+                        if let Some(decl) = binding.syntax().ancestors().find_map(JsVariableDeclaration::cast)
+                        && decl.is_const() {

107-109: Move AnyJsStaticMemberLike below the impl Rule block.

Per project convention, only the Query node union (NoVueRefAsOperandQuery) may live above the impl Rule block. Helper unions like AnyJsStaticMemberLike should be placed below it alongside other helper functions and types. Based on learnings: "all helper functions, structs, and enums must be placed below the impl Rule block. The only exception is when declaring a node union to use in the rule's Query type."


223-232: Variable call_expr shadows the outer ref-call binding.

Line 226 introduces a call_expr that shadows the one from line 147 (the ref initializer). It's scoped, so no logic bug, but a name like emit_call_expr would make intent clearer at a glance.

Comment thread .changeset/fair-parks-taste.md Outdated
Comment on lines +158 to +234
if let Some(parent) = expr.syntax().parent() {
match parent.kind() {
// if (refValue)
JsSyntaxKind::JS_IF_STATEMENT |
// switch (refValue)
JsSyntaxKind::JS_SWITCH_STATEMENT |
// -refValue, +refValue, !refValue, ~refValue, typeof refValue
JsSyntaxKind::JS_UNARY_EXPRESSION |
// refValue+1, refValue-1
JsSyntaxKind::JS_BINARY_EXPRESSION |
// bar+=refValue, bar-=refValue
JsSyntaxKind::JS_ASSIGNMENT_EXPRESSION => {
return Some(RuleState { range: ident_expr.range() })
}
// refValue || other, refValue && other. ignore: other || refValue
JsSyntaxKind::JS_LOGICAL_EXPRESSION => {
// Report only left
if let Some(logical_expr) = parent.cast::<JsLogicalExpression>()
&& let Ok(left)= logical_expr.left()
&& let Some(left) = left.as_js_identifier_expression()
&& left != ident_expr {
return None
}

// Report only constants
if let Some(decl) = binding.declaration()
&& let Some(grand_parent) = decl.syntax().grand_parent()
&& matches!(grand_parent.kind(), JsSyntaxKind::JS_VARIABLE_DECLARATION)
&& let Some(decl) = grand_parent.cast::<JsVariableDeclaration>()
&& (decl.is_const()) {
return Some(RuleState { range: ident_expr.range() })
}
}
// refValue ? x : y
JsSyntaxKind::JS_CONDITIONAL_EXPRESSION => {
// Report only test
if let Some(conditional_expr) = parent.cast::<JsConditionalExpression>()
&& let Ok(test)= conditional_expr.test()
&& let Some(expr) = test.as_js_identifier_expression()
&& expr != ident_expr {
return None
}

return Some(RuleState { range: ident_expr.range() })
}
// `${refValue}`
JsSyntaxKind::JS_TEMPLATE_ELEMENT => {
// Ignore tagged template
if let Some(template_ele) = parent.cast::<JsTemplateElement>()
&& let Some(grand_parent) = template_ele.syntax().grand_parent()
&& let Some(template_expr) = grand_parent.cast::<JsTemplateExpression>()
&& template_expr.tag().is_some() {
return None
}

return Some(RuleState { range: ident_expr.range() })
}
// refValue.x
JsSyntaxKind::JS_STATIC_MEMBER_ASSIGNMENT | JsSyntaxKind::JS_STATIC_MEMBER_EXPRESSION => {
if let Some(static_member_expr) = parent.cast::<AnyJsStaticMemberLike>() {
return check_static_member_access(ident_expr, ident_binding, &static_member_expr, call_expr)
}
}
// refValue in emit() in setup contexts: emit('event', refValue) or context.emit('event', refValue)
// refValue in emit() with defineEmits
JsSyntaxKind::JS_CALL_ARGUMENT_LIST => {
if let Some(call_argument_list) = parent.cast::<JsCallArgumentList>()
&& let Some(grand_parent) = call_argument_list.syntax().grand_parent()
&& let Some(call_expr) = grand_parent.cast::<JsCallExpression>()
&& let Ok(callee) = call_expr.callee()
&& (is_emit_call_in_setup(&callee, model) || is_emit_call_by_macro(&callee, model))
{
return Some(RuleState { range: ident_expr.range() });
}
}
_ => {}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find test files related to no_vue_ref_as_operand
find . -type f -name "*.rs" | xargs grep -l "no_vue_ref_as_operand" | head -20

Repository: biomejs/biome

Length of output: 230


🏁 Script executed:

#!/bin/bash
# Look for fixture/snapshot files
find . -type d -name "*no_vue_ref_as_operand*" 2>/dev/null

Repository: biomejs/biome

Length of output: 39


🏁 Script executed:

#!/bin/bash
# Search for test patterns in the rule file itself and nearby
find . -path "*nursery*" -name "*.rs" -o -name "*.snap" | grep -i "vue_ref" | head -20

Repository: biomejs/biome

Length of output: 124


🌐 Web query:

eslint-plugin-vue no-ref-as-operand rule while statement do-while for loop

💡 Result:

vue/no-ref-as-operand reports when you use a Vue ref() itself in an expression where you meant its inner value. In JS, a Ref is an object, so you must read/write the inner value via .value. (eslint.vuejs.org)

while / do...while

Bad:

const done = ref(false)

while (!done) {            // ❌ Ref used as operand
  // ...
  done = true              // ❌ (also illegal reassignment if const)
}

Good:

const done = ref(false)

while (!done.value) {      // ✅
  // ...
  done.value = true        // ✅
}

(And similarly for do { ... } while (cond).)

for loops (init / test / update)

Bad:

const i = ref(0)
const n = ref(10)

for (; i < n; i++) {       // ❌ i and n are refs; i++ updates the ref object
  // ...
}

Good (use .value everywhere inside the loop header):

const i = ref(0)
const n = ref(10)

for (; i.value < n.value; i.value++) {  // ✅
  // ...
}

Or (often cleaner) don’t use refs for loop counters:

const n = ref(10)

for (let i = 0; i < n.value; i++) {
  // ...
}

Note: the rule is fixable in some cases with ESLint --fix. (eslint.vuejs.org)

Citations:


🏁 Script executed:

#!/bin/bash
# Find test/fixture files for this rule
find . -type f \( -name "*.snap" -o -name "*.test.*" -o -name "*.spec.*" \) | xargs grep -l "no_vue_ref_as_operand" 2>/dev/null | head -10

Repository: biomejs/biome

Length of output: 39


🏁 Script executed:

#!/bin/bash
# Search for any fixture or snapshot directory
find . -type d -name "fixtures" -o -name "snapshots" | grep -i "nursery\|vue" | head -10

Repository: biomejs/biome

Length of output: 39


🏁 Script executed:

#!/bin/bash
# Look for snapshot files that might contain test cases
fd -e snap | xargs grep -l "while\|do.*while\|for" | xargs grep -l "ref" 2>/dev/null | head -5

Repository: biomejs/biome

Length of output: 697


🏁 Script executed:

#!/bin/bash
# Check the implementation for TODO or FIXME comments
rg -n "TODO|FIXME" crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs

Repository: biomejs/biome

Length of output: 39


🏁 Script executed:

#!/bin/bash
# Look at the full context of the file to understand test structure
wc -l crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs

Repository: biomejs/biome

Length of output: 126


🏁 Script executed:

#!/bin/bash
# Find the test specs directory
find crates/biome_js_analyze/tests -type d | head -20

Repository: biomejs/biome

Length of output: 1214


🏁 Script executed:

#!/bin/bash
# Look for any files related to vue or ref
find crates/biome_js_analyze/tests -type f -name "*vue*" -o -name "*ref*" 2>/dev/null | head -20

Repository: biomejs/biome

Length of output: 1665


🏁 Script executed:

#!/bin/bash
# Check the test directory structure
ls -la crates/biome_js_analyze/tests/specs/nursery/ 2>/dev/null | head -30

Repository: biomejs/biome

Length of output: 2019


🏁 Script executed:

#!/bin/bash
# Search for noVueRefAsOperand test files
find . -type f -name "*noVueRefAsOperand*" 2>/dev/null

Repository: biomejs/biome

Length of output: 39


🏁 Script executed:

#!/bin/bash
# Let's look at the entire rule file to see test structure
tail -100 crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs

Repository: biomejs/biome

Length of output: 3657


🏁 Script executed:

#!/bin/bash
# Check if noVueRefAsOperand directory exists at all
ls -la crates/biome_js_analyze/tests/specs/nursery/ | grep -i "ref\|vue"

Repository: biomejs/biome

Length of output: 936


🏁 Script executed:

#!/bin/bash
# Search more broadly for any test that mentions this rule
rg -l "noVueRefAsOperand" crates/biome_js_analyze/tests/

Repository: biomejs/biome

Length of output: 1696


🏁 Script executed:

#!/bin/bash
# Check if there's a test or spec for this rule elsewhere
find crates/biome_js_analyze -type f \( -name "*.vue" -o -name "*.js" \) | xargs rg -l "while.*ref\|for.*ref\|do.*while.*ref" 2>/dev/null | head -10

Repository: biomejs/biome

Length of output: 39


🏁 Script executed:

#!/bin/bash
# Let's check how the rule is imported/registered
rg "no_vue_ref_as_operand" crates/biome_js_analyze/src/lib.rs

Repository: biomejs/biome

Length of output: 39


🏁 Script executed:

#!/bin/bash
# List all test files in the noVueRefAsOperand directory
ls -1 crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand/ | grep -v snap

Repository: biomejs/biome

Length of output: 876


🏁 Script executed:

#!/bin/bash
# Check the invalid test files for while/do-while/for patterns
find crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand -name "invalid*.vue" -not -name "*.snap" | head -20

Repository: biomejs/biome

Length of output: 1611


🏁 Script executed:

#!/bin/bash
# Search for while/do-while/for in the actual test files
find crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand -name "*.vue" -not -name "*.snap" -exec cat {} \; 2>/dev/null | head -200

Repository: biomejs/biome

Length of output: 3375


🏁 Script executed:

#!/bin/bash
# Get a clearer picture - check each test file
for file in crates/biome_js_analyze/tests/specs/nursery/noVueRefAsOperand/invalid-*.vue; do
  echo "=== $(basename "$file") ==="
  head -30 "$file"
  echo ""
done

Repository: biomejs/biome

Length of output: 4172


Missing handling for while, do-while, and for loop conditions

The match arms cover if and switch but not loop contexts. Per the ESLint rule, while (refValue), do {} while (refValue), and for (; refValue; ) should all be flagged. Add JS_WHILE_STATEMENT, JS_DO_WHILE_STATEMENT, and JS_FOR_STATEMENT cases to keep parity with the upstream rule.

🤖 Prompt for AI Agents
In `@crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs` around
lines 158 - 234, The match over parent.kind() in the function that checks
identifier usage (look for ident_expr, ident_binding, RuleState and the match
parent.kind() block) currently flags
if/switch/unary/binary/assignment/logical/conditional/template/static-member/call-argument
cases but misses loop-condition contexts; add JsSyntaxKind::JS_WHILE_STATEMENT,
JsSyntaxKind::JS_DO_WHILE_STATEMENT, and JsSyntaxKind::JS_FOR_STATEMENT as
additional arms (or include them with the existing JsSyntaxKind::JS_IF_STATEMENT
| JsSyntaxKind::JS_SWITCH_STATEMENT arm) so that those loop conditions return
Some(RuleState { range: ident_expr.range() }) just like the if/switch case.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Original ESLint rule doesn't flag these cases, so keeping the same behavior for compatibility.

Comment thread crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Feb 14, 2026

Merging this PR will not alter performance

✅ 58 untouched benchmarks
⏩ 95 skipped benchmarks1


Comparing taga3s:implement-noVueRefAsOperand (e576dd0) with main (fbe460f)

Open in CodSpeed

Footnotes

  1. 95 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @.changeset/fair-parks-taste.md:
- Line 5: The changeset for the new lint rule noVueRefAsOperand lacks an
invalid-code example; update the .changeset entry to include a short snippet
that demonstrates using a Vue ref as a boolean/operand (e.g., using count where
count is created via ref(0)) and show the corrected form using count.value so
users see both the flagged pattern and the fix; reference the rule name
noVueRefAsOperand and include the suggested invalid line and its corrected
counterpart in the changeset text.

Comment thread .changeset/fair-parks-taste.md
@taga3s taga3s force-pushed the implement-noVueRefAsOperand branch from 70ffe0f to 90449d8 Compare February 14, 2026 23:47
Copy link
Copy Markdown
Contributor

@dyc3 dyc3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The impl looks good, just notes on the diagnostic pretty much.

Comment thread crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs Outdated
Comment thread crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs
@taga3s taga3s requested a review from dyc3 February 17, 2026 11:25
@taga3s
Copy link
Copy Markdown
Contributor Author

taga3s commented Feb 21, 2026

@dyc3 Could you review again when you have a chance? Thanks.

@taga3s taga3s force-pushed the implement-noVueRefAsOperand branch from 0f2d7c9 to b3b070c Compare February 21, 2026 23:58
Copy link
Copy Markdown
Contributor

@dyc3 dyc3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the wait! Looks good.

Comment thread crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs Outdated
Comment thread crates/biome_js_analyze/src/lint/nursery/no_vue_ref_as_operand.rs Outdated
@taga3s
Copy link
Copy Markdown
Contributor Author

taga3s commented Feb 22, 2026

@dyc3 Thank you for reviewing again! I have addressed nit comments.

@dyc3 dyc3 merged commit 3d0648f into biomejs:main Feb 22, 2026
20 checks passed
@github-actions github-actions Bot mentioned this pull request Feb 22, 2026
@taga3s taga3s deleted the implement-noVueRefAsOperand branch February 22, 2026 00:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CLI Area: CLI A-Diagnostic Area: diagnostocis A-Linter Area: linter A-Project Area: project L-JavaScript Language: JavaScript and super languages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

📎 Port vue/no-ref-as-operand from eslint-plugin-vue

2 participants