Skip to content
This repository has been archived by the owner on Aug 31, 2023. It is now read-only.

Commit

Permalink
fix(rome_js_analyze): useValidAnchor considering all possible express…
Browse files Browse the repository at this point in the history
…ions (#3599)

* useValidAnchor considering all possible expressions
  • Loading branch information
xunilrj committed Nov 9, 2022
1 parent b788d70 commit 8e03ce7
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 33 deletions.
80 changes: 47 additions & 33 deletions crates/rome_js_analyze/src/analyzers/a11y/use_valid_anchor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -268,47 +268,61 @@ fn is_invalid_anchor(anchor_attribute: &JsxAttribute) -> Option<UseValidAnchorSt
match attribute_value {
JsxAnyAttributeValue::JsxExpressionAttributeValue(attribute_value) => {
let expression = attribute_value.expression().ok()?;
// href={null}
if let JsAnyExpression::JsAnyLiteralExpression(
JsAnyLiteralExpression::JsNullLiteralExpression(null),
) = expression
{
return Some(UseValidAnchorState::IncorrectHref(
null.syntax().text_trimmed_range(),
));
} else if let JsAnyExpression::JsIdentifierExpression(identifier) = expression {
let text = identifier.name().ok()?.value_token().ok()?;
// href={undefined}
if text.text_trimmed() == "undefined" {

match expression {
// href={null}
JsAnyExpression::JsAnyLiteralExpression(
JsAnyLiteralExpression::JsNullLiteralExpression(null),
) => {
return Some(UseValidAnchorState::IncorrectHref(
text.text_trimmed_range(),
null.syntax().text_trimmed_range(),
));
}
} else if let JsAnyExpression::JsAnyLiteralExpression(
JsAnyLiteralExpression::JsStringLiteralExpression(string_literal),
) = expression
{
let text = string_literal.inner_string_text().ok()?;
if text == "#" {
return Some(UseValidAnchorState::IncorrectHref(
string_literal.syntax().text_trimmed_range(),
));
JsAnyExpression::JsIdentifierExpression(identifier) => {
let text = identifier.name().ok()?.value_token().ok()?;
// href={undefined}
if text.text_trimmed() == "undefined" {
return Some(UseValidAnchorState::IncorrectHref(
text.text_trimmed_range(),
));
}
}
} else if let JsAnyExpression::JsTemplate(template) = expression {
let mut iter = template.elements().iter();
if let Some(JsAnyTemplateElement::JsTemplateChunkElement(element)) = iter.next() {
let template_token = element.template_chunk_token().ok()?;
let text = template_token.text_trimmed();
if text == "#" || text.contains("javascript:") {
JsAnyExpression::JsAnyLiteralExpression(
JsAnyLiteralExpression::JsStringLiteralExpression(string_literal),
) => {
let text = string_literal.inner_string_text().ok()?;
if text == "#" {
return Some(UseValidAnchorState::IncorrectHref(
template_token.text_trimmed_range(),
string_literal.syntax().text_trimmed_range(),
));
}
}
} else {
return Some(UseValidAnchorState::IncorrectHref(
expression.syntax().text_trimmed_range(),
));
JsAnyExpression::JsTemplate(template) => {
let mut iter = template.elements().iter();
if let Some(JsAnyTemplateElement::JsTemplateChunkElement(element)) = iter.next()
{
let template_token = element.template_chunk_token().ok()?;
let text = template_token.text_trimmed();
if text == "#" || text.contains("javascript:") {
return Some(UseValidAnchorState::IncorrectHref(
template_token.text_trimmed_range(),
));
}
}
}
JsAnyExpression::ImportMeta(_)
| JsAnyExpression::JsClassExpression(_)
| JsAnyExpression::JsImportCallExpression(_)
| JsAnyExpression::JsObjectExpression(_)
| JsAnyExpression::JsSuperExpression(_)
| JsAnyExpression::JsUnaryExpression(_)
| JsAnyExpression::JsxTagExpression(_)
| JsAnyExpression::NewTarget(_) => {
return Some(UseValidAnchorState::IncorrectHref(
expression.syntax().text_trimmed_range(),
));
}
_ => {}
}
}
JsxAnyAttributeValue::JsxAnyTag(_) => {}
Expand Down
6 changes: 6 additions & 0 deletions crates/rome_js_analyze/tests/specs/a11y/useValidAnchor.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,10 @@
<a href={`https://www.javascript.com`}/>
<a href={somewhere}/>
<a {...spread }/>
<a href={getFileUrl()}>Download</a>
<a href={a ? b : c}>Download</a>
<a href={1 + 2}>Download</a>
<a href={await getLink()}>Download</a>
<a href={a["a"]}>Download</a>
<a href={true ?? "url"}>Download</a>
</>
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ expression: useValidAnchor.jsx
<a href={`https://www.javascript.com`}/>
<a href={somewhere}/>
<a {...spread }/>
<a href={getFileUrl()}>Download</a>
<a href={a ? b : c}>Download</a>
<a href={1 + 2}>Download</a>
<a href={await getLink()}>Download</a>
<a href={a["a"]}>Download</a>
<a href={true ?? "url"}>Download</a>
</>
```
Expand Down

0 comments on commit 8e03ce7

Please sign in to comment.