@@ -9,6 +9,7 @@ const docsUrl = require('../util/docsUrl');
9
9
const getSourceCode = require ( '../util/eslint' ) . getSourceCode ;
10
10
const jsxUtil = require ( '../util/jsx' ) ;
11
11
const report = require ( '../util/report' ) ;
12
+ const getMessageData = require ( '../util/message' ) ;
12
13
13
14
// ------------------------------------------------------------------------------
14
15
// Rule Definition
@@ -34,11 +35,13 @@ const DEFAULTS = [{
34
35
const messages = {
35
36
unescapedEntity : 'HTML entity, `{{entity}}` , must be escaped.' ,
36
37
unescapedEntityAlts : '`{{entity}}` can be escaped with {{alts}}.' ,
38
+ replaceWithAlt : 'Replace with `{{alt}}`.' ,
37
39
} ;
38
40
39
41
/** @type {import('eslint').Rule.RuleModule } */
40
42
module . exports = {
41
43
meta : {
44
+ hasSuggestions : true ,
42
45
docs : {
43
46
description : 'Disallow unescaped HTML entities from appearing in markup' ,
44
47
category : 'Possible Errors' ,
@@ -117,6 +120,25 @@ module.exports = {
117
120
entity : entities [ j ] . char ,
118
121
alts : entities [ j ] . alternatives . map ( ( alt ) => `\`${ alt } \`` ) . join ( ', ' ) ,
119
122
} ,
123
+ suggest : entities [ j ] . alternatives . map ( ( alt ) => Object . assign (
124
+ getMessageData ( 'replaceWithAlt' , messages . replaceWithAlt ) ,
125
+ {
126
+ data : { alt } ,
127
+ fix ( fixer ) {
128
+ const lineToChange = i - node . loc . start . line ;
129
+
130
+ const newText = node . raw . split ( '\n' ) . map ( ( line , idx ) => {
131
+ if ( idx === lineToChange ) {
132
+ return line . slice ( 0 , index ) + alt + line . slice ( index + 1 ) ;
133
+ }
134
+
135
+ return line ;
136
+ } ) . join ( '\n' ) ;
137
+
138
+ return fixer . replaceText ( node , newText ) ;
139
+ } ,
140
+ }
141
+ ) ) ,
120
142
} ) ;
121
143
}
122
144
}
0 commit comments