eslint-plugin-sonarjs
Version:
74 lines (73 loc) • 2.53 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isAssertion = isAssertion;
exports.isTSAssertion = isTSAssertion;
exports.chainStartsWithCy = chainStartsWithCy;
const ast_js_1 = require("./ast.js");
const typescript_1 = __importDefault(require("typescript"));
const ASSERTION_METHODS = ['should', 'and'];
/**
* Detects Cypress assertion calls on the global `cy` chain, e.g.:
* cy.get('selector').should('be.visible')
* cy.contains('text').and('have.attr', 'href')
* cy.intercept(...).as(...); cy.wait('@alias').its('foo').should(...)
*/
function isAssertion(node) {
if (node.type !== 'CallExpression') {
return false;
}
if (node.callee.type !== 'MemberExpression' || node.callee.computed) {
return false;
}
if (!(0, ast_js_1.isIdentifier)(node.callee.property, ...ASSERTION_METHODS)) {
return false;
}
return chainStartsWithCy(node.callee.object);
}
function isTSAssertion(node) {
if (node.kind !== typescript_1.default.SyntaxKind.CallExpression) {
return false;
}
const call = node;
if (call.expression.kind !== typescript_1.default.SyntaxKind.PropertyAccessExpression) {
return false;
}
const member = call.expression;
if (!ASSERTION_METHODS.includes(member.name.text)) {
return false;
}
return tsChainStartsWithCy(member.expression);
}
function chainStartsWithCy(node) {
if ((0, ast_js_1.isIdentifier)(node, 'cy')) {
return true;
}
if (node.type === 'MemberExpression') {
return chainStartsWithCy(node.object);
}
if (node.type === 'CallExpression') {
return chainStartsWithCy(node.callee);
}
if (node.type === 'ChainExpression') {
return chainStartsWithCy(node.expression);
}
return false;
}
function tsChainStartsWithCy(node) {
if (node.kind === typescript_1.default.SyntaxKind.Identifier) {
return node.text === 'cy';
}
if (node.kind === typescript_1.default.SyntaxKind.PropertyAccessExpression) {
return tsChainStartsWithCy(node.expression);
}
if (node.kind === typescript_1.default.SyntaxKind.CallExpression) {
return tsChainStartsWithCy(node.expression);
}
if (node.kind === typescript_1.default.SyntaxKind.NonNullExpression) {
return tsChainStartsWithCy(node.expression);
}
return false;
}