42 lines
1.0 KiB
JavaScript
42 lines
1.0 KiB
JavaScript
|
/**
|
||
|
* @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
|
||
|
};
|