sicua
Version:
A tool for analyzing project structure and dependencies
106 lines (105 loc) • 4.02 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodeTypeGuards = void 0;
const typescript_1 = __importDefault(require("typescript"));
class NodeTypeGuards {
/**
* Checks if node is a component declaration
*/
static isComponentDeclaration(node) {
return ((typescript_1.default.isFunctionDeclaration(node) || typescript_1.default.isClassDeclaration(node)) &&
!!node.name &&
/^[A-Z]/.test(node.name.text));
}
/**
* Checks if node is a hook call
*/
static isHookCall(node) {
return (typescript_1.default.isCallExpression(node) &&
typescript_1.default.isIdentifier(node.expression) &&
node.expression.text.startsWith("use"));
}
/**
* Checks if node is a JSX component
*/
static isJsxComponent(node) {
return ((typescript_1.default.isJsxElement(node) || typescript_1.default.isJsxSelfClosingElement(node)) &&
this.hasCapitalizedName(node));
}
/**
* Checks if node is an event handler
*/
static isEventHandler(node) {
return ((typescript_1.default.isMethodDeclaration(node) || typescript_1.default.isPropertyDeclaration(node)) &&
!!node.name &&
(node.name.getText().startsWith("handle") ||
node.name.getText().startsWith("on")));
}
/**
* Checks if node is a state declaration
*/
static isStateDeclaration(node) {
if (!typescript_1.default.isVariableDeclaration(node))
return false;
if (!node.initializer)
return false;
if (!typescript_1.default.isArrayBindingPattern(node.name))
return false;
return (typescript_1.default.isCallExpression(node.initializer) &&
typescript_1.default.isIdentifier(node.initializer.expression) &&
node.initializer.expression.text === "useState");
}
/**
* Checks if node is an effect declaration
*/
static isEffectCall(node) {
return (typescript_1.default.isCallExpression(node) &&
typescript_1.default.isIdentifier(node.expression) &&
(node.expression.text === "useEffect" ||
node.expression.text === "useLayoutEffect"));
}
/**
* Checks if node is a memo declaration
*/
static isMemoCall(node) {
return (typescript_1.default.isCallExpression(node) &&
typescript_1.default.isIdentifier(node.expression) &&
(node.expression.text === "useMemo" ||
node.expression.text === "useCallback"));
}
/**
* Helper to check if JSX element has capitalized name
*/
static hasCapitalizedName(node) {
const tagName = typescript_1.default.isJsxElement(node)
? node.openingElement.tagName
: node.tagName;
return typescript_1.default.isIdentifier(tagName) && /^[A-Z]/.test(tagName.text);
}
/**
* Checks if node is a type reference
*/
static isTypeReference(node) {
return typescript_1.default.isTypeReferenceNode(node) && typescript_1.default.isIdentifier(node.typeName);
}
/**
* Checks if node is an async function
*/
static isAsyncFunction(node) {
if (!typescript_1.default.isFunctionLike(node))
return false;
// Handle different types of function-like declarations
if (typescript_1.default.isFunctionDeclaration(node) ||
typescript_1.default.isMethodDeclaration(node) ||
typescript_1.default.isFunctionExpression(node) ||
typescript_1.default.isArrowFunction(node)) {
return (node.modifiers?.some((m) => m.kind === typescript_1.default.SyntaxKind.AsyncKeyword) ??
false);
}
return false;
}
}
exports.NodeTypeGuards = NodeTypeGuards;