@@ -19,7 +19,8 @@ export const enforceLogicalProperties = createRule({
1919 recommended : false ,
2020
2121 messages : {
22- replaceable : "Physical class detected. Replace \"{{ className }}\" with logical class \"{{fix}}\"."
22+ multiple : "Physical class detected. Replace \"{{ className }}\" with logical classes \"{{fix}}\"." ,
23+ single : "Physical class detected. Replace \"{{ className }}\" with logical class \"{{fix}}\"."
2324 } ,
2425
2526 initialize : ctx => {
@@ -82,8 +83,16 @@ const mappings = [
8283 [ / ^ f l o a t - l e f t $ / , "float-start" ] ,
8384 [ / ^ f l o a t - r i g h t $ / , "float-end" ] ,
8485 [ / ^ c l e a r - l e f t $ / , "clear-start" ] ,
85- [ / ^ c l e a r - r i g h t $ / , "clear-end" ]
86- ] satisfies [ before : RegExp , after : string ] [ ] ;
86+ [ / ^ c l e a r - r i g h t $ / , "clear-end" ] ,
87+
88+ [ / ^ h - ( .* ) $ / , "block-$1" ] ,
89+ [ / ^ w - ( .* ) $ / , "inline-$1" ] ,
90+ [ / ^ m i n - h - ( .* ) $ / , "min-block-$1" ] ,
91+ [ / ^ m i n - w - ( .* ) $ / , "min-inline-$1" ] ,
92+ [ / ^ m a x - h - ( .* ) $ / , "max-block-$1" ] ,
93+ [ / ^ m a x - w - ( .* ) $ / , "max-inline-$1" ] ,
94+ [ / ^ s i z e - ( .* ) $ / , [ "block-$1" , "inline-$1" ] ]
95+ ] satisfies [ before : RegExp , after : string [ ] | string ] [ ] ;
8796
8897
8998function lintLiterals ( ctx : Context < typeof enforceLogicalProperties > , literals : Literal [ ] ) {
@@ -93,13 +102,13 @@ function lintLiterals(ctx: Context<typeof enforceLogicalProperties>, literals: L
93102 const { dissectedClasses, warnings } = getDissectedClasses ( async ( ctx ) , classes ) ;
94103
95104 const possibleFixes = Object . values ( dissectedClasses ) . flatMap ( dissectedClass => {
96- const replacementBase = getReplacementBase ( dissectedClass . base ) ;
105+ const replacementBases = getReplacementBases ( dissectedClass . base ) ;
97106
98- if ( ! replacementBase ) {
107+ if ( ! replacementBases ) {
99108 return [ ] ;
100109 }
101110
102- return [ buildClass ( ctx , { ...dissectedClass , base : replacementBase } ) ] ;
111+ return replacementBases . map ( base => buildClass ( ctx , { ...dissectedClass , base } ) ) ;
103112 } ) ;
104113
105114 const { unknownClasses } = getUnknownClasses ( async ( ctx ) , possibleFixes ) ;
@@ -111,39 +120,45 @@ function lintLiterals(ctx: Context<typeof enforceLogicalProperties>, literals: L
111120 return ;
112121 }
113122
114- const replacementBase = getReplacementBase ( dissectedClass . base ) ;
123+ const replacementBases = getReplacementBases ( dissectedClass . base ) ;
115124
116- if ( ! replacementBase ) {
125+ if ( ! replacementBases ) {
117126 return ;
118127 }
119128
120- const fix = buildClass ( ctx , { ...dissectedClass , base : replacementBase } ) ;
129+ const fixClasses = replacementBases . map ( base => buildClass ( ctx , { ...dissectedClass , base } ) ) ;
130+ const hasUnknownFix = fixClasses . some ( fixClass => unknownClasses . includes ( fixClass ) ) ;
121131
122- if ( unknownClasses . includes ( fix ) ) {
132+ if ( hasUnknownFix ) {
123133 return ;
124134 }
125135
136+ const fix = fixClasses . join ( " " ) ;
137+ const id = fixClasses . length > 1 ? "multiple" : "single" ;
138+
126139 return {
127140 data : {
128141 className,
129142 fix
130143 } ,
131144 fix,
132- id : "replaceable" ,
145+ id,
133146 warnings
134147 } as const ;
135148 } ) ;
136149 }
137150}
138151
139- function getReplacementBase ( base : string ) {
152+ function getReplacementBases ( base : string ) : string [ ] | undefined {
140153 for ( const [ pattern , replacement ] of mappings ) {
141154 const match = base . match ( pattern ) ;
142155
143156 if ( ! match ) {
144157 continue ;
145158 }
146159
147- return replacePlaceholders ( replacement , match ) ;
160+ return Array . isArray ( replacement )
161+ ? replacement . map ( part => replacePlaceholders ( part , match ) )
162+ : [ replacePlaceholders ( replacement , match ) ] ;
148163 }
149164}
0 commit comments