UNPKG

sicua

Version:

A tool for analyzing project structure and dependencies

106 lines (105 loc) 4.02 kB
"use strict"; 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;