77} from '@adguard/agtree' ;
88import { type DeclarationPlain , type PseudoClassSelectorPlain } from '@adguard/ecss-tree' ;
99
10+ import { REMOVE_PROPERTY , REMOVE_VALUE } from '../common/constants' ;
1011import { defineRule , LinterRuleType } from '../linter/rule' ;
1112
1213import { SUPPORTED_EXT_CSS_PSEUDO_CLASSES } from './no-unsupported-css-pseudo-class' ;
@@ -32,6 +33,10 @@ export default defineRule({
3233 name : 'Element hiding with extended selector' ,
3334 code : '#?#div:contains(a)' ,
3435 } ,
36+ {
37+ name : '`remove: true` with extended CSS injection separator' ,
38+ code : '#?$#a[href^="/bnlink/?bnid="] { remove: true; }' ,
39+ } ,
3540 ] ,
3641 incorrectExamples : [
3742 {
@@ -71,14 +76,14 @@ export default defineRule({
7176 const currentSeparatorValue = currentRuleSeparator . value ;
7277
7378 if ( hasExtendedDeclarations ) {
74- let suggested : string ;
79+ let suggestedSeparator : string ;
7580
7681 switch ( currentSeparatorValue ) {
7782 case CosmeticRuleSeparator . AdgExtendedCssInjection :
78- suggested = CosmeticRuleSeparator . AdgExtendedCssInjection ;
83+ suggestedSeparator = CosmeticRuleSeparator . AdgExtendedCssInjection ;
7984 break ;
8085 case CosmeticRuleSeparator . AdgExtendedCssInjectionException :
81- suggested = CosmeticRuleSeparator . AdgExtendedCssInjectionException ;
86+ suggestedSeparator = CosmeticRuleSeparator . AdgExtendedCssInjectionException ;
8287 break ;
8388 default :
8489 return ;
@@ -92,28 +97,28 @@ export default defineRule({
9297 context . report ( {
9398 messageId : 'removeOnlyWithExtended' ,
9499 data : {
95- required : suggested ,
100+ required : suggestedSeparator ,
96101 } ,
97102 node,
98103 suggest : [
99104 {
100105 messageId : 'changeSeparator' ,
101106 data : {
102- suggested,
107+ suggested : suggestedSeparator ,
103108 } ,
104- fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggested ) ,
109+ fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggestedSeparator ) ,
105110 } ,
106111 ] ,
107112 } ) ;
108113 return ;
109114 }
110115
111116 if ( hasPseudoClassSelectors ) {
112- const suggested = currentRuleException
117+ const suggestedSeparator = currentRuleException
113118 ? CosmeticRuleSeparator . ExtendedElementHidingException
114119 : CosmeticRuleSeparator . ExtendedElementHiding ;
115120
116- if ( currentSeparatorValue === suggested ) {
121+ if ( currentSeparatorValue === suggestedSeparator ) {
117122 return ;
118123 }
119124
@@ -126,22 +131,22 @@ export default defineRule({
126131 messageId : 'useExtendedSeparator' ,
127132 data : {
128133 current : currentSeparatorValue ,
129- suggested,
134+ suggested : suggestedSeparator ,
130135 } ,
131136 node,
132137 suggest : [
133138 {
134139 messageId : 'changeSeparator' ,
135140 data : {
136- suggested,
141+ suggested : suggestedSeparator ,
137142 } ,
138- fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggested ) ,
143+ fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggestedSeparator ) ,
139144 } ,
140145 ] ,
141146 } ) ;
142147 } else if ( currentSeparatorValue === CosmeticRuleSeparator . ExtendedElementHiding
143148 || currentSeparatorValue === CosmeticRuleSeparator . ExtendedElementHidingException ) {
144- const suggested = currentRuleException
149+ const suggestedSeparator = currentRuleException
145150 ? CosmeticRuleSeparator . ElementHidingException
146151 : CosmeticRuleSeparator . ElementHiding ;
147152
@@ -154,16 +159,16 @@ export default defineRule({
154159 messageId : 'useNativeSeparator' ,
155160 data : {
156161 current : currentSeparatorValue ,
157- suggested,
162+ suggested : suggestedSeparator ,
158163 } ,
159164 node,
160165 suggest : [
161166 {
162167 messageId : 'changeSeparator' ,
163168 data : {
164- suggested,
169+ suggested : suggestedSeparator ,
165170 } ,
166- fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggested ) ,
171+ fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggestedSeparator ) ,
167172 } ,
168173 ] ,
169174 } ) ;
@@ -186,11 +191,11 @@ export default defineRule({
186191
187192 // Check if CSS injection rule needs extended separator
188193 if ( needsExtended ) {
189- const suggested = currentRuleException
194+ const suggestedSeparator = currentRuleException
190195 ? CosmeticRuleSeparator . AdgExtendedCssInjectionException
191196 : CosmeticRuleSeparator . AdgExtendedCssInjection ;
192197
193- if ( currentRuleSeparator . value === suggested ) {
198+ if ( currentRuleSeparator . value === suggestedSeparator ) {
194199 return ;
195200 }
196201
@@ -205,23 +210,23 @@ export default defineRule({
205210 context . report ( {
206211 messageId,
207212 data : {
208- [ dataKey ] : suggested ,
213+ [ dataKey ] : suggestedSeparator ,
209214 ...( messageId === 'useExtendedSeparator' && { current : currentRuleSeparator . value } ) ,
210215 } ,
211216 node,
212217 suggest : [
213218 {
214219 messageId : 'changeSeparator' ,
215- data : { suggested } ,
216- fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggested ) ,
220+ data : { suggested : suggestedSeparator } ,
221+ fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggestedSeparator ) ,
217222 } ,
218223 ] ,
219224 } ) ;
220225 } else if (
221226 currentRuleSeparator . value === CosmeticRuleSeparator . AdgExtendedCssInjection
222227 || currentRuleSeparator . value === CosmeticRuleSeparator . AdgExtendedCssInjectionException
223228 ) {
224- const suggested = currentRuleException
229+ const suggestedSeparator = currentRuleException
225230 ? CosmeticRuleSeparator . AdgCssInjectionException
226231 : CosmeticRuleSeparator . AdgCssInjection ;
227232
@@ -232,13 +237,13 @@ export default defineRule({
232237
233238 context . report ( {
234239 messageId : 'useNativeSeparator' ,
235- data : { current : currentRuleSeparator . value , suggested } ,
240+ data : { current : currentRuleSeparator . value , suggested : suggestedSeparator } ,
236241 node,
237242 suggest : [
238243 {
239244 messageId : 'changeSeparator' ,
240- data : { suggested } ,
241- fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggested ) ,
245+ data : { suggested : suggestedSeparator } ,
246+ fix : ( fixer ) => fixer . replaceWithText ( separatorRange , suggestedSeparator ) ,
242247 } ,
243248 ] ,
244249 } ) ;
@@ -253,15 +258,15 @@ export default defineRule({
253258 } ,
254259
255260 Declaration : ( node : DeclarationPlain ) => {
256- if ( node . property !== 'remove' ) {
261+ if ( node . property !== REMOVE_PROPERTY ) {
257262 return ;
258263 }
259264
260265 if (
261266 node . value ?. type === 'Value'
262267 && node . value ?. children . length === 1
263268 && node . value . children [ 0 ] ?. type === 'Identifier'
264- && node . value . children [ 0 ] . name === 'true'
269+ && node . value . children [ 0 ] . name === REMOVE_VALUE
265270 ) {
266271 hasExtendedDeclarations = true ;
267272 }
0 commit comments