eslint-plugin-mocha
Version:
Eslint rules for mocha.
84 lines • 3.63 kB
JavaScript
import { reduceWithArgs } from '../list.js';
import { reformatLastPathSegmentWithCallExpressions } from '../mocha/name-details.js';
import { isSamePath } from '../mocha/path.js';
import { resolveAliasedReferences } from './alias-references.js';
import { findGlobalReferencesByName } from './find-global-references.js';
import { findImportReferencesByName } from './find-import-references.js';
import { isConstantPath } from './member-expression.js';
import { isCallExpression, isMemberExpression } from './node-types.js';
function isCallExpressionReference(reference) {
return reference.node.type === 'CallExpression';
}
function addReferenceToResults(results, matchingReference) {
return [...results, matchingReference];
}
function getCallDetails(reference) {
let { node } = reference;
let count = 0;
while (node.parent.type === 'CallExpression') {
node = node.parent;
count += 1;
}
return { node, amountOfCallExpressions: count };
}
function shouldProcessReference(results, reference) {
if (isCallExpressionReference(reference)) {
const { node: newNode, amountOfCallExpressions } = getCallDetails(reference);
return addReferenceToResults(results, {
...reference,
node: newNode,
resolvedPath: reformatLastPathSegmentWithCallExpressions(reference.resolvedPath, amountOfCallExpressions)
});
}
return results;
}
function findMatchingNameDetails(pathToMatch, names) {
for (const nameDetails of names) {
if (isSamePath(pathToMatch, nameDetails.normalizedPath)) {
return nameDetails;
}
}
return null;
}
// eslint-disable-next-line max-statements -- needs to be refactored
function shouldAddReferenceToResults(results, reference, names) {
const nameDetails = findMatchingNameDetails(reference.resolvedPath, names);
if (nameDetails === null) {
return results;
}
const { callee } = reference.node;
if (nameDetails.config !== null && isMemberExpression(callee) && isCallExpression(callee.object)) {
const resolvedPath2 = reference.resolvedPath.slice(0, -1);
const path2 = reference.path.slice(0, -1);
const nameDetails2 = findMatchingNameDetails(resolvedPath2, names);
if (nameDetails2 !== null) {
return [
...results,
{ ...reference, nameDetails, name: reference.resolvedPath.join('.') },
{
...reference,
node: callee.object,
name: path2.join('.'),
path: path2,
resolvedPath: resolvedPath2,
nameDetails: nameDetails2
}
];
}
}
return [...results, { ...reference, nameDetails, name: reference.resolvedPath.join('.') }];
}
function isResultWithConstantPath(result) {
return isConstantPath(result.path);
}
export function findMochaVariableCalls(context, names, interfaceToUse) {
const { sourceCode } = context;
const references = interfaceToUse === 'exports'
? findImportReferencesByName(context, names, 'mocha')
: findGlobalReferencesByName(context, names);
const resolvedReferences = resolveAliasedReferences(sourceCode, references);
const constantResolvedReferences = reduceWithArgs(resolvedReferences, shouldProcessReference, []);
const filteredReferences = constantResolvedReferences.filter(isResultWithConstantPath);
return reduceWithArgs(filteredReferences, shouldAddReferenceToResults, [], names);
}
//# sourceMappingURL=find-mocha-variable-calls.js.map