You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.0 KiB
41 lines
1.0 KiB
/** |
|
* @fileoverview Utility functions for JSX |
|
*/ |
|
|
|
'use strict'; |
|
|
|
const elementType = require('jsx-ast-utils/elementType'); |
|
|
|
const COMPAT_TAG_REGEX = /^[a-z]|-/; |
|
|
|
/** |
|
* Checks if a node represents a DOM element. |
|
* @param {object} node - JSXOpeningElement to check. |
|
* @returns {boolean} Whether or not the node corresponds to a DOM element. |
|
*/ |
|
function isDOMComponent(node) { |
|
let name = elementType(node); |
|
|
|
// Get namespace if the type is JSXNamespacedName or JSXMemberExpression |
|
if (name.indexOf(':') > -1) { |
|
name = name.slice(0, name.indexOf(':')); |
|
} else if (name.indexOf('.') > -1) { |
|
name = name.slice(0, name.indexOf('.')); |
|
} |
|
|
|
return COMPAT_TAG_REGEX.test(name); |
|
} |
|
|
|
/** |
|
* Checks if a node represents a JSX element or fragment. |
|
* @param {object} node - node to check. |
|
* @returns {boolean} Whether or not the node if a JSX element or fragment. |
|
*/ |
|
function isJSX(node) { |
|
return node && ['JSXElement', 'JSXFragment'].indexOf(node.type) >= 0; |
|
} |
|
|
|
module.exports = { |
|
isDOMComponent, |
|
isJSX |
|
};
|
|
|