diff --git a/lib/rules/no-unescaped-entities.js b/lib/rules/no-unescaped-entities.js index 1fa88d1f5e..e8bccaa426 100644 --- a/lib/rules/no-unescaped-entities.js +++ b/lib/rules/no-unescaped-entities.js @@ -14,7 +14,19 @@ const jsxUtil = require('../util/jsx'); // NOTE: '<' and '{' are also problematic characters, but they do not need // to be included here because it is a syntax error when these characters are // included accidentally. -const DEFAULTS = ['>', '"', '\'', '}']; +const DEFAULTS = [{ + char: '>', + alternatives: ['>'] +}, { + char: '"', + alternatives: ['"', '“', '"', '”'] +}, { + char: '\'', + alternatives: [''', '‘', ''', '’'] +}, { + char: '}', + alternatives: ['}'] +}]; module.exports = { meta: { @@ -59,10 +71,18 @@ module.exports = { for (let j = 0; j < entities.length; j++) { for (let index = 0; index < rawLine.length; index++) { const c = rawLine[index]; - if (c === entities[j]) { + if (typeof entities[j] === 'string') { + if (c === entities[j]) { + context.report({ + loc: {line: i, column: start + index}, + message: `HTML entities, \`${entities[j]}\` , must be escaped.`, + node: node + }); + } + } else if (c === entities[j].char) { context.report({ loc: {line: i, column: start + index}, - message: 'HTML entities must be escaped.', + message: `\`${entities[j].char}\` can be escaped with ${entities[j].alternatives.map(alt => `\`${alt}\``).join(', ')}.`, node: node }); } diff --git a/tests/lib/rules/no-unescaped-entities.js b/tests/lib/rules/no-unescaped-entities.js index aff01dca5b..1df6232bbf 100644 --- a/tests/lib/rules/no-unescaped-entities.js +++ b/tests/lib/rules/no-unescaped-entities.js @@ -112,7 +112,7 @@ ruleTester.run('no-unescaped-entities', rule, { } }); `, - errors: [{message: 'HTML entities must be escaped.'}] + errors: [{message: '`>` can be escaped with `>`.'}] }, { code: ` var Hello = createReactClass({ @@ -122,7 +122,7 @@ ruleTester.run('no-unescaped-entities', rule, { }); `, parser: 'babel-eslint', - errors: [{message: 'HTML entities must be escaped.'}] + errors: [{message: '`>` can be escaped with `>`.'}] }, { code: ` var Hello = createReactClass({ @@ -133,7 +133,7 @@ ruleTester.run('no-unescaped-entities', rule, { } }); `, - errors: [{message: 'HTML entities must be escaped.'}] + errors: [{message: '`>` can be escaped with `>`.'}] }, { code: ` var Hello = createReactClass({ @@ -145,7 +145,7 @@ ruleTester.run('no-unescaped-entities', rule, { }); `, parser: 'babel-eslint', - errors: [{message: 'HTML entities must be escaped.'}] + errors: [{message: '`>` can be escaped with `>`.'}] }, { code: ` var Hello = createReactClass({ @@ -154,7 +154,7 @@ ruleTester.run('no-unescaped-entities', rule, { } }); `, - errors: [{message: 'HTML entities must be escaped.'}] + errors: [{message: '`\'` can be escaped with `'`, `‘`, `'`, `’`.'}] }, { code: ` var Hello = createReactClass({ @@ -164,9 +164,9 @@ ruleTester.run('no-unescaped-entities', rule, { }); `, errors: [ - {message: 'HTML entities must be escaped.'}, - {message: 'HTML entities must be escaped.'}, - {message: 'HTML entities must be escaped.'} + {message: '`\'` can be escaped with `'`, `‘`, `'`, `’`.'}, + {message: '`>` can be escaped with `>`.'}, + {message: '`>` can be escaped with `>`.'} ] }, { code: ` @@ -176,7 +176,7 @@ ruleTester.run('no-unescaped-entities', rule, { } }); `, - errors: [{message: 'HTML entities must be escaped.'}] + errors: [{message: '`}` can be escaped with `}`.'}] }, { code: ` var Hello = createReactClass({ @@ -186,7 +186,7 @@ ruleTester.run('no-unescaped-entities', rule, { }); `, parser: 'babel-eslint', - errors: [{message: 'HTML entities must be escaped.'}] + errors: [{message: '`}` can be escaped with `}`.'}] } ] });