@@ -9,6 +9,7 @@ const docsUrl = require('../util/docsUrl');
99const getSourceCode = require ( '../util/eslint' ) . getSourceCode ;
1010const jsxUtil = require ( '../util/jsx' ) ;
1111const report = require ( '../util/report' ) ;
12+ const getMessageData = require ( '../util/message' ) ;
1213
1314// ------------------------------------------------------------------------------
1415// Rule Definition
@@ -34,11 +35,13 @@ const DEFAULTS = [{
3435const messages = {
3536 unescapedEntity : 'HTML entity, `{{entity}}` , must be escaped.' ,
3637 unescapedEntityAlts : '`{{entity}}` can be escaped with {{alts}}.' ,
38+ replaceWithAlt : 'Replace with `{{alt}}`.' ,
3739} ;
3840
3941/** @type {import('eslint').Rule.RuleModule } */
4042module . exports = {
4143 meta : {
44+ hasSuggestions : true ,
4245 docs : {
4346 description : 'Disallow unescaped HTML entities from appearing in markup' ,
4447 category : 'Possible Errors' ,
@@ -117,6 +120,25 @@ module.exports = {
117120 entity : entities [ j ] . char ,
118121 alts : entities [ j ] . alternatives . map ( ( alt ) => `\`${ alt } \`` ) . join ( ', ' ) ,
119122 } ,
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+ ) ) ,
120142 } ) ;
121143 }
122144 }
0 commit comments