eslint-plugin-ava
Version:
ESLint rules for AVA
96 lines (87 loc) • 2.7 kB
JavaScript
import {visitIf} from 'enhance-visitors';
import util from '../util.js';
import createAvaRule from '../create-ava-rule.js';
const MESSAGE_ID = 'no-deep-equal-with-primitive';
const buildDeepEqualMessage = (context, node) => {
context.report({
node,
messageId: MESSAGE_ID,
data: {
callee: node.callee.property.name,
},
fix: fixer => fixer.replaceText(node.callee.property, 'is'),
});
};
const buildNotDeepEqualMessage = (context, node) => {
context.report({
node,
messageId: MESSAGE_ID,
data: {
callee: node.callee.property.name,
},
fix: fixer => fixer.replaceText(node.callee.property, 'not'),
});
};
const create = context => {
const ava = createAvaRule();
const callExpression = 'CallExpression';
const deepEqual = '[callee.property.name="deepEqual"]';
const notDeepEqual = '[callee.property.name="notDeepEqual"]';
const argumentsLiteral = ':matches([arguments.0.type="Literal"][arguments.0.regex="undefined"],[arguments.1.type="Literal"][arguments.1.regex="undefined"])';
const argumentsUndefined = ':matches([arguments.0.type="Identifier"][arguments.0.name="undefined"],[arguments.1.type="Identifier"][arguments.1.name="undefined"])';
const argumentsTemplate = ':matches([arguments.0.type="TemplateLiteral"],[arguments.1.type="TemplateLiteral"])';
return ava.merge({
[`${callExpression}${deepEqual}${argumentsLiteral}`]: visitIf([
ava.isInTestFile,
ava.isInTestNode,
])(node => {
buildDeepEqualMessage(context, node);
}),
[`${callExpression}${deepEqual}${argumentsUndefined}`]: visitIf([
ava.isInTestFile,
ava.isInTestNode,
])(node => {
buildDeepEqualMessage(context, node);
}),
[`${callExpression}${deepEqual}${argumentsTemplate}`]: visitIf([
ava.isInTestFile,
ava.isInTestNode,
])(node => {
buildDeepEqualMessage(context, node);
}),
[`${callExpression}${notDeepEqual}${argumentsLiteral}`]: visitIf([
ava.isInTestFile,
ava.isInTestNode,
])(node => {
buildNotDeepEqualMessage(context, node);
}),
[`${callExpression}${notDeepEqual}${argumentsUndefined}`]: visitIf([
ava.isInTestFile,
ava.isInTestNode,
])(node => {
buildNotDeepEqualMessage(context, node);
}),
[`${callExpression}${notDeepEqual}${argumentsTemplate}`]: visitIf([
ava.isInTestFile,
ava.isInTestNode,
])(node => {
buildNotDeepEqualMessage(context, node);
}),
});
};
export default {
create,
meta: {
type: 'suggestion',
docs: {
description: 'Disallow using `deepEqual` with primitives.',
recommended: true,
url: util.getDocsUrl(import.meta.filename),
},
fixable: 'code',
schema: [],
messages: {
[MESSAGE_ID]: 'Avoid using `{{callee}}` with literal primitives',
},
},
};