From 226b922ded2e29d0968857e4b5d547dbd47c76c8 Mon Sep 17 00:00:00 2001 From: Alban Auzeill Date: Tue, 24 Dec 2019 11:04:49 +0100 Subject: Add parameter for S4660 to define custom pseudo-elements (#220) --- its/plugin/projects/issues-project/src/file1.css | 4 ++++ .../test/java/org/sonar/css/its/IssuesTest.java | 1 + .../rules/SelectorPseudoElementNoUnknown.java | 28 ++++++++++++++++++++++ .../org/sonar/css/plugin/rules/CssRuleTest.java | 15 ++++++++++++ yarn.lock | 4 ++++ 5 files changed, 52 insertions(+) create mode 100644 yarn.lock diff --git a/its/plugin/projects/issues-project/src/file1.css b/its/plugin/projects/issues-project/src/file1.css index aea7607..fc08fd4 100644 --- a/its/plugin/projects/issues-project/src/file1.css +++ b/its/plugin/projects/issues-project/src/file1.css @@ -13,6 +13,10 @@ a::pseudo { /* S4660 | selecto color: red; } +a::ng-deep, a::custom-element { /* "ng-deep" and "custom-element" ignored by S4660 | selector-pseudo-element-no-unknown */ + color: red; +} + a:unknown { /* S4659 | selector-pseudo-class-no-unknown */ background-color: #ffw; /* S4647 | color-no-invalid-hex */ /* */ /* S4663 | comment-no-empty */ diff --git a/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java b/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java index a81230a..cb6b9c1 100644 --- a/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java +++ b/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java @@ -51,6 +51,7 @@ public class IssuesTest { @BeforeClass public static void prepare() { RulesConfiguration rulesConfiguration = new RulesConfiguration(); + rulesConfiguration.add("S4660", "ignorePseudoElements", "ng-deep, /^custom-/"); File profile = ProfileGenerator.generateProfile(orchestrator.getServer().getUrl(), "css", "css", rulesConfiguration, Collections.emptySet()); orchestrator.getServer().restoreProfile(FileLocation.of(profile)); diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/SelectorPseudoElementNoUnknown.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/SelectorPseudoElementNoUnknown.java index c26dfc2..8682859 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/SelectorPseudoElementNoUnknown.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/SelectorPseudoElementNoUnknown.java @@ -19,13 +19,41 @@ */ package org.sonar.css.plugin.rules; +import java.util.Arrays; +import java.util.List; import org.sonar.check.Rule; +import org.sonar.check.RuleProperty; + +import static org.sonar.css.plugin.rules.RuleUtils.splitAndTrim; @Rule(key = "S4660") public class SelectorPseudoElementNoUnknown implements CssRule { + private static final String DEFAULT_IGNORE_PSEUDO_ELEMENTS = "ng-deep"; + @Override public String stylelintKey() { return "selector-pseudo-element-no-unknown"; } + + @RuleProperty( + key = "ignorePseudoElements", + description = "Comma-separated list of regular expressions or strings to ignore (e.g. /^custom-/).", + defaultValue = "" + DEFAULT_IGNORE_PSEUDO_ELEMENTS) + String ignorePseudoElements = DEFAULT_IGNORE_PSEUDO_ELEMENTS; + + @Override + public List stylelintOptions() { + return Arrays.asList(true, new StylelintIgnorePseudoElementsOption(splitAndTrim(ignorePseudoElements))); + } + + private static class StylelintIgnorePseudoElementsOption { + // Used by GSON serialization + private final List ignorePseudoElements; + + StylelintIgnorePseudoElementsOption(List ignorePseudoElements) { + this.ignorePseudoElements = ignorePseudoElements; + } + } + } diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/rules/CssRuleTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/rules/CssRuleTest.java index e7945b7..bd18c4b 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/rules/CssRuleTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/rules/CssRuleTest.java @@ -46,6 +46,7 @@ public class CssRuleTest { DeclarationBlockNoDuplicateProperties.class, PropertyNoUnknown.class, SelectorPseudoClassNoUnknown.class, + SelectorPseudoElementNoUnknown.class, SelectorTypeNoUnknown.class, UnitNoUnknown.class); @@ -85,6 +86,20 @@ public class CssRuleTest { assertThat(optionsAsJson).isEqualTo("[true,{\"ignoreTypes\":[\"/^(mat|md|fa)-/\"]}]"); } + @Test + public void selector_pseudo_element_no_unknown_default() { + String optionsAsJson = new Gson().toJson(new SelectorPseudoElementNoUnknown().stylelintOptions()); + assertThat(optionsAsJson).isEqualTo("[true,{\"ignorePseudoElements\":[\"ng-deep\"]}]"); + } + + @Test + public void selector_pseudo_element_no_unknown_custom() { + SelectorPseudoElementNoUnknown selectorPseudoElementNoUnknown = new SelectorPseudoElementNoUnknown(); + selectorPseudoElementNoUnknown.ignorePseudoElements = "ng-deep, /^custom-/"; + String optionsAsJson = new Gson().toJson(selectorPseudoElementNoUnknown.stylelintOptions()); + assertThat(optionsAsJson).isEqualTo("[true,{\"ignorePseudoElements\":[\"ng-deep\",\"/^custom-/\"]}]"); + } + @Test public void units_no_unknown_options() { String optionsAsJson = new Gson().toJson(new UnitNoUnknown().stylelintOptions()); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..fb57ccd --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + -- cgit v1.2.3