diff --git a/lib/rules/jsx-no-useless-fragment.js b/lib/rules/jsx-no-useless-fragment.js index 9c9d5f9b33..7bfba43cca 100644 --- a/lib/rules/jsx-no-useless-fragment.js +++ b/lib/rules/jsx-no-useless-fragment.js @@ -6,51 +6,6 @@ const pragmaUtil = require('../util/pragma'); const docsUrl = require('../util/docsUrl'); -/** - * Test whether a JSXElement is a fragment - * @param {JSXElement} node - * @param {object} context - * @returns {boolean} - */ -function isFragment(node, context) { - const name = node.openingElement.name; - const reactPragma = pragmaUtil.getFromContext(context); - const fragmentPragma = pragmaUtil.getFragmentFromContext(context); - - // - if ( - name.type === 'JSXIdentifier' - && name.name === fragmentPragma - ) { - return true; - } - - // - if ( - name.type === 'JSXMemberExpression' - && name.object.type === 'JSXIdentifier' - && name.object.name === reactPragma - && name.property.type === 'JSXIdentifier' - && name.property.name === fragmentPragma - ) { - return true; - } - - return false; -} - - -/** - * Test whether a node is an padding spaces trimmed by react runtime. - * @param {ASTNode} node - * @returns {boolean} - */ -function isPaddingSpaces(node) { - return (node.type === 'JSXText' || node.type === 'Literal') - && /^\s*$/.test(node.raw) - && node.raw.includes('\n'); -} - module.exports = { meta: { @@ -68,6 +23,54 @@ module.exports = { }, create(context) { + const reactPragma = pragmaUtil.getFromContext(context); + const fragmentPragma = pragmaUtil.getFragmentFromContext(context); + + /** + * Test whether a JSXElement is a fragment + * @param {JSXElement} node + * @returns {boolean} + */ + function isFragment(node) { + const name = node.openingElement.name; + + // + if ( + name.type === 'JSXIdentifier' + && name.name === fragmentPragma + ) { + return true; + } + + // + if ( + name.type === 'JSXMemberExpression' + && name.object.type === 'JSXIdentifier' + && name.object.name === reactPragma + && name.property.type === 'JSXIdentifier' + && name.property.name === fragmentPragma + ) { + return true; + } + + return false; + } + + /** + * Test whether a node is an padding spaces trimmed by react runtime. + * @param {ASTNode} node + * @returns {boolean} + */ + function isPaddingSpaces(node) { + return (node.type === 'JSXText' || node.type === 'Literal') + && /^\s*$/.test(node.raw) + && node.raw.includes('\n'); + } + + /** + * Test whether a JSXElement has less than two children, excluding paddings spaces. + * @param {JSXElement|JSXFragment} node + */ function hasLessThanTwoChildren(node) { if (node.children.length < 2) { return true; @@ -108,7 +111,7 @@ module.exports = { return { JSXElement(node) { - if (isFragment(node, context)) { + if (isFragment(node)) { checkNode(node); } },