diff --git a/lib/rules/jsx-no-useless-fragment.js b/lib/rules/jsx-no-useless-fragment.js index 2951f170f1..8816e1aae0 100644 --- a/lib/rules/jsx-no-useless-fragment.js +++ b/lib/rules/jsx-no-useless-fragment.js @@ -4,6 +4,7 @@ 'use strict'; const pragmaUtil = require('../util/pragma'); +const jsxUtil = require('../util/jsx'); const docsUrl = require('../util/docsUrl'); @@ -27,36 +28,6 @@ module.exports = { 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 @@ -157,7 +128,7 @@ module.exports = { return { JSXElement(node) { - if (isFragment(node)) { + if (jsxUtil.isFragment(node, reactPragma, fragmentPragma)) { checkNode(node); } }, diff --git a/lib/util/jsx.js b/lib/util/jsx.js index 69849df733..95e30c49d0 100644 --- a/lib/util/jsx.js +++ b/lib/util/jsx.js @@ -25,6 +25,35 @@ function isDOMComponent(node) { return COMPAT_TAG_REGEX.test(name); } +/** + * Test whether a JSXElement is a fragment + * @param {JSXElement} node + * @param {string} reactPragma + * @param {string} fragmentPragma + * @returns {boolean} + */ +function isFragment(node, reactPragma, fragmentPragma) { + 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; +} + /** * Checks if a node represents a JSX element or fragment. * @param {object} node - node to check. @@ -36,5 +65,6 @@ function isJSX(node) { module.exports = { isDOMComponent: isDOMComponent, + isFragment, isJSX: isJSX };