From 6aa787475579cddb30acdac6557d7e164561be2c Mon Sep 17 00:00:00 2001 From: Axel Nyffenegger Date: Mon, 23 Mar 2020 10:00:15 +0100 Subject: [PATCH] [Fix] `jsx-no-comment-textnodes`: fix for `@typescript-eslint/parser` - `@typescript-eslint/parser` requires eslint 5+ (and node 6+) Fixes #2599. --- lib/rules/jsx-no-comment-textnodes.js | 39 ++-- package.json | 1 + tests/helpers/parsers.js | 3 +- tests/lib/rules/jsx-no-comment-textnodes.js | 217 +++++++++++++++++++- 4 files changed, 240 insertions(+), 20 deletions(-) diff --git a/lib/rules/jsx-no-comment-textnodes.js b/lib/rules/jsx-no-comment-textnodes.js index e245d11fc0..39e56bef38 100644 --- a/lib/rules/jsx-no-comment-textnodes.js +++ b/lib/rules/jsx-no-comment-textnodes.js @@ -11,6 +11,24 @@ const docsUrl = require('../util/docsUrl'); // Rule Definition // ------------------------------------------------------------------------------ +function checkText(node, context) { + // since babel-eslint has the wrong node.raw, we'll get the source text + const rawValue = context.getSourceCode().getText(node); + if (/^\s*\/(\/|\*)/m.test(rawValue)) { + // inside component, e.g.
literal
+ if ( + node.parent.type !== 'JSXAttribute' && + node.parent.type !== 'JSXExpressionContainer' && + node.parent.type.indexOf('JSX') !== -1 + ) { + context.report({ + node, + message: 'Comments inside children section of tag should be placed inside braces' + }); + } + } +} + module.exports = { meta: { docs: { @@ -28,29 +46,16 @@ module.exports = { }, create(context) { - function reportLiteralNode(node) { - context.report({ - node, - message: 'Comments inside children section of tag should be placed inside braces' - }); - } - // -------------------------------------------------------------------------- // Public // -------------------------------------------------------------------------- return { Literal(node) { - // since babel-eslint has the wrong node.raw, we'll get the source text - const rawValue = context.getSourceCode().getText(node); - if (/^\s*\/(\/|\*)/m.test(rawValue)) { - // inside component, e.g.
literal
- if (node.parent.type !== 'JSXAttribute' && - node.parent.type !== 'JSXExpressionContainer' && - node.parent.type.indexOf('JSX') !== -1) { - reportLiteralNode(node); - } - } + checkText(node, context); + }, + JSXText(node) { + checkText(node, context); } }; } diff --git a/package.json b/package.json index bb55974631..77be18cf50 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@types/eslint": "^6.1.8", "@types/estree": "0.0.42", "@types/node": "^13.7.4", + "@typescript-eslint/parser": "^2.24.0", "babel-eslint": "^8.2.6", "coveralls": "^3.0.9", "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", diff --git a/tests/helpers/parsers.js b/tests/helpers/parsers.js index 64291b6125..be4994e0e0 100644 --- a/tests/helpers/parsers.js +++ b/tests/helpers/parsers.js @@ -6,5 +6,6 @@ const NODE_MODULES = '../../node_modules'; module.exports = { BABEL_ESLINT: path.join(__dirname, NODE_MODULES, 'babel-eslint'), - TYPESCRIPT_ESLINT: path.join(__dirname, NODE_MODULES, 'typescript-eslint-parser') + TYPESCRIPT_ESLINT: path.join(__dirname, NODE_MODULES, 'typescript-eslint-parser'), + '@TYPESCRIPT_ESLINT': path.join(__dirname, NODE_MODULES, '@typescript-eslint/parser') }; diff --git a/tests/lib/rules/jsx-no-comment-textnodes.js b/tests/lib/rules/jsx-no-comment-textnodes.js index 8c94cc6d46..a01f5de1e3 100644 --- a/tests/lib/rules/jsx-no-comment-textnodes.js +++ b/tests/lib/rules/jsx-no-comment-textnodes.js @@ -9,11 +9,20 @@ // Requirements // ------------------------------------------------------------------------------ +const semver = require('semver'); +const version = require('eslint/package.json').version; const RuleTester = require('eslint').RuleTester; const rule = require('../../../lib/rules/jsx-no-comment-textnodes'); const parsers = require('../../helpers/parsers'); +function TS(tests) { + if (semver.satisfies(version, '>= 5')) { + return tests; + } + return []; +} + const parserOptions = { ecmaVersion: 2018, sourceType: 'module', @@ -173,7 +182,133 @@ ruleTester.run('jsx-no-comment-textnodes', rule, { code: '
/* TODO: Write perfect code */
', parser: parsers.BABEL_ESLINT } - ], + ].concat(TS([ + { + code: ` + class Comp1 extends Component { + render() { + return ( +
+ {/* valid */} +
+ ); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { + code: ` + class Comp1 extends Component { + render() { + return ( + <> + {/* valid */} + + ); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { + code: ` + class Comp1 extends Component { + render() { + return (
{/* valid */}
); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { + code: ` + class Comp1 extends Component { + render() { + const bar = (
{/* valid */}
); + return bar; + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { + code: ` + var Hello = createReactClass({ + foo: (
{/* valid */}
), + render() { + return this.foo; + }, + }); + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { + code: ` + class Comp1 extends Component { + render() { + return ( +
+ {/* valid */} + {/* valid 2 */} + {/* valid 3 */} +
+ ); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { + code: ` + class Comp1 extends Component { + render() { + return ( +
+
+ ); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { + code: ` + var foo = require('foo'); + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, { + code: ` + + {/* valid */} + + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, + { + code: ` + +  https://www.example.com/attachment/download/1 + + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, + + // inside element declarations + { + code: ` + + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, + { + code: ` + + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, + { + code: '
// TODO: Write perfect code
', + parser: parsers['@TYPESCRIPT_ESLINT'] + }, + { + code: '
/* TODO: Write perfect code */
', + parser: parsers['@TYPESCRIPT_ESLINT'] + } + ])), invalid: [ { @@ -253,5 +388,83 @@ ruleTester.run('jsx-no-comment-textnodes', rule, { parser: parsers.BABEL_ESLINT, errors: [{message: 'Comments inside children section of tag should be placed inside braces'}] } - ] + ].concat(TS([ + { + code: ` + class Comp1 extends Component { + render() { + return (
// invalid
); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'], + errors: [{message: 'Comments inside children section of tag should be placed inside braces'}] + }, { + code: ` + class Comp1 extends Component { + render() { + return (<>// invalid); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'], + errors: [{message: 'Comments inside children section of tag should be placed inside braces'}] + }, { + code: ` + class Comp1 extends Component { + render() { + return (
/* invalid */
); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'], + errors: [{message: 'Comments inside children section of tag should be placed inside braces'}] + }, { + code: ` + class Comp1 extends Component { + render() { + return ( +
+ // invalid +
+ ); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'], + errors: [{message: 'Comments inside children section of tag should be placed inside braces'}] + }, { + code: ` + class Comp1 extends Component { + render() { + return ( +
+ asdjfl + /* invalid */ + foo +
+ ); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'], + errors: [{message: 'Comments inside children section of tag should be placed inside braces'}] + }, { + code: ` + class Comp1 extends Component { + render() { + return ( +
+ {'asdjfl'} + // invalid + {'foo'} +
+ ); + } + } + `, + parser: parsers['@TYPESCRIPT_ESLINT'], + errors: [{message: 'Comments inside children section of tag should be placed inside braces'}] + } + ])) });