Skip to content

Commit

Permalink
feat(biome_css_analyze): keyframe-block-no-duplicate-selectors (#2534)
Browse files Browse the repository at this point in the history
Co-authored-by: ty <[email protected]>
  • Loading branch information
isnakode and togami2864 committed Apr 20, 2024
1 parent ff73013 commit 5df8781
Show file tree
Hide file tree
Showing 11 changed files with 300 additions and 18 deletions.
58 changes: 40 additions & 18 deletions crates/biome_configuration/src/linter/rules.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions crates/biome_css_analyze/src/lint/nursery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use biome_analyze::declare_group;
pub mod no_color_invalid_hex;
pub mod no_css_empty_block;
pub mod no_duplicate_font_names;
pub mod no_duplicate_selectors_keyframe_block;

declare_group! {
pub Nursery {
Expand All @@ -13,6 +14,7 @@ declare_group! {
self :: no_color_invalid_hex :: NoColorInvalidHex ,
self :: no_css_empty_block :: NoCssEmptyBlock ,
self :: no_duplicate_font_names :: NoDuplicateFontNames ,
self :: no_duplicate_selectors_keyframe_block :: NoDuplicateSelectorsKeyframeBlock ,
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
use std::collections::HashSet;

use biome_analyze::{context::RuleContext, declare_rule, Ast, Rule, RuleDiagnostic, RuleSource};
use biome_console::markup;
use biome_css_syntax::{AnyCssKeyframesItem, AnyCssKeyframesSelector, CssKeyframesBlock};
use biome_rowan::AstNode;

declare_rule! {
/// Disallow duplicate selectors within keyframe blocks.
///
/// ## Examples
///
/// ### Invalid
///
/// ```css,expect_diagnostic
/// @keyframes foo { from {} from {} }
/// ```
///
/// ```css,expect_diagnostic
/// @keyframes foo { from {} FROM {} }
/// ```
///
/// ```css,expect_diagnostic
/// @keyframes foo { 0% {} 0% {} }
/// ```
///
/// ### Valid
///
/// ```css
/// @keyframes foo { 0% {} 100% {} }
/// ```
///
/// ```css
/// @keyframes foo { from {} to {} }
/// ```
///
pub NoDuplicateSelectorsKeyframeBlock {
version: "next",
name: "noDuplicateSelectorsKeyframeBlock",
recommended: true,
sources:&[RuleSource::Stylelint("keyframe-block-no-duplicate-selectors")],
}
}

impl Rule for NoDuplicateSelectorsKeyframeBlock {
type Query = Ast<CssKeyframesBlock>;
type State = AnyCssKeyframesSelector;
type Signals = Option<Self::State>;
type Options = ();

fn run(ctx: &RuleContext<Self>) -> Option<Self::State> {
let node = ctx.query();
let mut selector_list = HashSet::new();
for keyframe_item in node.items() {
match keyframe_item {
AnyCssKeyframesItem::CssKeyframesItem(item) => {
let keyframe_selector = item.selectors().into_iter().next()?.ok()?;
if !selector_list.insert(keyframe_selector.text().to_lowercase()) {
return Some(keyframe_selector);
}
}
_ => return None,
}
}
None
}

fn diagnostic(_: &RuleContext<Self>, node: &Self::State) -> Option<RuleDiagnostic> {
Some(
RuleDiagnostic::new(
rule_category!(),
node.range(),
markup! {
"Unexpected duplicate selector: "<Emphasis>{node.text()}</Emphasis>
},
)
.note(markup! {
"Consider using a different percentage value or keyword to avoid duplication"
}),
)
}
}
1 change: 1 addition & 0 deletions crates/biome_css_analyze/src/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ pub type NoCssEmptyBlock =
<lint::nursery::no_css_empty_block::NoCssEmptyBlock as biome_analyze::Rule>::Options;
pub type NoDuplicateFontNames =
<lint::nursery::no_duplicate_font_names::NoDuplicateFontNames as biome_analyze::Rule>::Options;
pub type NoDuplicateSelectorsKeyframeBlock = < lint :: nursery :: no_duplicate_selectors_keyframe_block :: NoDuplicateSelectorsKeyframeBlock as biome_analyze :: Rule > :: Options ;
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
@keyframes foo { from {} from {}}

@keyframes foo { from {} FROM {}}

@keyframes foo { 0% {} 0% {}}

@keyframes foo { from {} to {} to {} }

@keyframes foo { 0% {} 0% {} 100% {} }

@-webkit-keyframes foo { 0% {} 0% {} 100% {} }

@-moz-keyframes foo { 0% {} 0% {} 100% {} }
Loading

0 comments on commit 5df8781

Please sign in to comment.