@@ -66,7 +66,7 @@ export default createRule('block-lang', {
66
66
67
67
const scriptOption : string | null | ( string | null ) [ ] = context . options [ 0 ] ?. script ?? null ;
68
68
const allowedScriptLangs : ( string | null ) [ ] = Array . isArray ( scriptOption )
69
- ? scriptOption
69
+ ? scriptOption . filter ( ( lang ) => lang != null && lang !== '' )
70
70
: [ scriptOption ] ;
71
71
const scriptNodes : SvelteScriptElement [ ] = [ ] ;
72
72
@@ -90,76 +90,108 @@ export default createRule('block-lang', {
90
90
message : `The <script> block should be present and its lang attribute should be ${ prettyPrintLangs (
91
91
allowedScriptLangs
92
92
) } .`,
93
- * fix ( fixer ) {
94
- const langAttributeText = getLangAttributeText ( allowedScriptLangs , true ) ;
95
-
96
- yield fixer . insertTextAfterRange (
97
- [ 0 , 0 ] ,
98
- `<script${ langAttributeText } >\n</script>\n\n`
99
- ) ;
100
- }
93
+ suggest : allowedScriptLangs
94
+ . filter ( ( lang ) => lang != null && lang !== '' )
95
+ . map ( ( lang ) => {
96
+ return {
97
+ desc : `Add a <script> block with the lang attribute set to "${ lang } ".` ,
98
+ fix : ( fixer ) => {
99
+ const langAttributeText = getLangAttributeText ( lang ?? '' , true ) ;
100
+ return fixer . insertTextAfterRange (
101
+ [ 0 , 0 ] ,
102
+ `<script${ langAttributeText } >\n</script>\n\n`
103
+ ) ;
104
+ }
105
+ } ;
106
+ } )
101
107
} ) ;
102
108
}
103
109
for ( const scriptNode of scriptNodes ) {
104
110
if ( ! allowedScriptLangs . includes ( getLangValue ( scriptNode ) ?. toLowerCase ( ) ?? null ) ) {
111
+ const langAttribute = findAttribute ( scriptNode , 'lang' ) ;
105
112
context . report ( {
106
113
node : scriptNode ,
107
114
message : `The lang attribute of the <script> block should be ${ prettyPrintLangs (
108
115
allowedScriptLangs
109
116
) } .`,
110
- * fix ( fixer ) {
111
- const langAttribute = findAttribute ( scriptNode , 'lang' ) ;
112
- const langAttributeText = getLangAttributeText ( allowedScriptLangs , true ) ;
113
-
114
- if ( langAttribute ) {
115
- yield fixer . replaceText ( langAttribute , langAttributeText . trim ( ) ) ;
116
- } else {
117
- yield fixer . insertTextBeforeRange (
118
- [ scriptNode . startTag . range [ 0 ] + 7 , 0 ] ,
119
- langAttributeText
120
- ) ;
121
- }
122
- }
117
+ suggest : allowedScriptLangs
118
+ . filter ( ( lang ) => lang != null && lang !== '' )
119
+ . map ( ( lang ) => {
120
+ const langAttributeText = getLangAttributeText ( lang ?? '' , true ) ;
121
+ if ( langAttribute ) {
122
+ return {
123
+ desc : `Add a <script> block with the lang attribute set to "${ lang } ".` ,
124
+ fix : ( fixer ) => {
125
+ return fixer . replaceText ( langAttribute , langAttributeText . trim ( ) ) ;
126
+ }
127
+ } ;
128
+ }
129
+ return {
130
+ desc : `Add a <script> block with the lang attribute set to "${ lang } ".` ,
131
+ fix : ( fixer ) => {
132
+ return fixer . insertTextBeforeRange (
133
+ [ scriptNode . startTag . range [ 0 ] + 7 , 0 ] ,
134
+ langAttributeText
135
+ ) ;
136
+ }
137
+ } ;
138
+ } )
123
139
} ) ;
124
140
}
125
141
}
126
142
if ( styleNodes . length === 0 && enforceStylePresent ) {
143
+ const sourceCode = getSourceCode ( context ) ;
127
144
context . report ( {
128
145
loc : { line : 1 , column : 1 } ,
129
146
message : `The <style> block should be present and its lang attribute should be ${ prettyPrintLangs (
130
147
allowedStyleLangs
131
148
) } .`,
132
- * fix ( fixer ) {
133
- const sourceCode = getSourceCode ( context ) ;
134
- const langAttributeText = getLangAttributeText ( allowedScriptLangs , true ) ;
135
-
136
- yield fixer . insertTextAfterRange (
137
- [ sourceCode . text . length , sourceCode . text . length ] ,
138
- `\n\n<style${ langAttributeText } >\n</style>`
139
- ) ;
140
- }
149
+ suggest : allowedStyleLangs
150
+ . filter ( ( lang ) => lang != null && lang !== '' )
151
+ . map ( ( lang ) => {
152
+ return {
153
+ desc : `Add a <style> block with the lang attribute set to "${ lang } ".` ,
154
+ fix : ( fixer ) => {
155
+ const langAttributeText = getLangAttributeText ( lang ?? '' , true ) ;
156
+ return fixer . insertTextAfterRange (
157
+ [ sourceCode . text . length , sourceCode . text . length ] ,
158
+ `<style${ langAttributeText } >\n</style>\n\n`
159
+ ) ;
160
+ }
161
+ } ;
162
+ } )
141
163
} ) ;
142
164
}
143
165
for ( const styleNode of styleNodes ) {
144
166
if ( ! allowedStyleLangs . includes ( getLangValue ( styleNode ) ?. toLowerCase ( ) ?? null ) ) {
167
+ const langAttribute = findAttribute ( styleNode , 'lang' ) ;
145
168
context . report ( {
146
169
node : styleNode ,
147
170
message : `The lang attribute of the <style> block should be ${ prettyPrintLangs (
148
171
allowedStyleLangs
149
172
) } .`,
150
- * fix ( fixer ) {
151
- const langAttribute = findAttribute ( styleNode , 'lang' ) ;
152
- const langAttributeText = getLangAttributeText ( allowedStyleLangs , true ) ;
153
-
154
- if ( langAttribute ) {
155
- yield fixer . replaceText ( langAttribute , langAttributeText . trim ( ) ) ;
156
- } else {
157
- yield fixer . insertTextBeforeRange (
158
- [ styleNode . startTag . range [ 0 ] + 6 , 0 ] ,
159
- langAttributeText
160
- ) ;
161
- }
162
- }
173
+ suggest : allowedStyleLangs
174
+ . filter ( ( lang ) => lang != null && lang !== '' )
175
+ . map ( ( lang ) => {
176
+ const langAttributeText = getLangAttributeText ( lang ?? '' , true ) ;
177
+ if ( langAttribute ) {
178
+ return {
179
+ desc : `Add a <style> block with the lang attribute set to "${ lang } ".` ,
180
+ fix : ( fixer ) => {
181
+ return fixer . replaceText ( langAttribute , langAttributeText . trim ( ) ) ;
182
+ }
183
+ } ;
184
+ }
185
+ return {
186
+ desc : `Add a <style> block with the lang attribute set to "${ lang } ".` ,
187
+ fix : ( fixer ) => {
188
+ return fixer . insertTextBeforeRange (
189
+ [ styleNode . startTag . range [ 0 ] + 6 , 0 ] ,
190
+ langAttributeText
191
+ ) ;
192
+ }
193
+ } ;
194
+ } )
163
195
} ) ;
164
196
}
165
197
}
@@ -175,7 +207,7 @@ function prettyPrintLangs(langs: (string | null)[]): string {
175
207
const hasNull = langs . includes ( null ) ;
176
208
const nonNullLangs = langs . filter ( ( lang ) => lang !== null ) . map ( ( lang ) => `"${ lang } "` ) ;
177
209
if ( nonNullLangs . length === 0 ) {
178
- // No special behaviour for `hasNull`, because that can never happen.
210
+ // No special behavior for `hasNull`, because that can never happen.
179
211
return 'omitted' ;
180
212
}
181
213
const hasNullText = hasNull ? 'either omitted or ' : '' ;
@@ -187,11 +219,6 @@ function prettyPrintLangs(langs: (string | null)[]): string {
187
219
/**
188
220
* Returns the lang attribute text, with special handling of the `null` lang option with respect to the `prependWhitespace` argument.
189
221
*/
190
- function getLangAttributeText ( langs : ( string | null ) [ ] , prependWhitespace : boolean ) : string {
191
- if ( ! langs . length || langs . includes ( null ) ) return '' ;
192
- const [ firstLang ] = langs ;
193
- if ( langs . length === 1 && firstLang ) {
194
- return `${ prependWhitespace ? ' ' : '' } lang="${ firstLang } "` ;
195
- }
196
- return '' ;
222
+ function getLangAttributeText ( lang : string , prependWhitespace : boolean ) : string {
223
+ return `${ prependWhitespace ? ' ' : '' } lang="${ lang } "` ;
197
224
}
0 commit comments