107 lines
2.7 KiB
JavaScript
107 lines
2.7 KiB
JavaScript
//@ts-nocheck
|
|
module.exports = {
|
|
meta: {
|
|
type: "problem",
|
|
docs: {
|
|
description:
|
|
"Ensure that all where condition that thest for null values utilize the correct operators.",
|
|
},
|
|
fixable: "code",
|
|
schema: [], // no options
|
|
},
|
|
create(context) {
|
|
const sourceCode = context.sourceCode;
|
|
const reportedNodes = new Set();
|
|
if (!/\.where\(/.test(sourceCode.text)) {
|
|
// Skip
|
|
return {};
|
|
}
|
|
|
|
return {
|
|
ExpressionStatement(node) {
|
|
evaluate(node.expression, sourceCode.getTokens(node));
|
|
},
|
|
AwaitExpression(node) {
|
|
evaluate(node.argument, sourceCode.getTokens(node));
|
|
},
|
|
};
|
|
|
|
function Check(expression, operator) {
|
|
const forbiddenOperators = [
|
|
"'='",
|
|
"'=='",
|
|
"'!='",
|
|
"'!=='",
|
|
'"="',
|
|
'"=="',
|
|
'"!="',
|
|
'"!=="',
|
|
];
|
|
|
|
if (forbiddenOperators.includes(operator.value)) {
|
|
const message = `The where condition is testing for null using the ${operator.value} operator. Ensure this is intentional and uses the correct operator.`;
|
|
|
|
context.report({
|
|
node: expression,
|
|
message,
|
|
fix: (fixer) => {
|
|
const correctOperator =
|
|
operator.value === "'='" ||
|
|
operator.value === "'=='" ||
|
|
operator.value === '"="' ||
|
|
operator.value === '"=="'
|
|
? "'is'"
|
|
: "'is not'";
|
|
return fixer.replaceText(operator, correctOperator);
|
|
},
|
|
});
|
|
}
|
|
}
|
|
function findNodes(expression, node, nodes) {
|
|
const nullNodes = nodes.filter((token) => token.value === "null");
|
|
if (nullNodes.length === 0) {
|
|
return;
|
|
}
|
|
for (let i = 0; i < nullNodes.length; i++) {
|
|
const nullNode = nullNodes[i];
|
|
|
|
// Avoid duplicate reports
|
|
if (reportedNodes.has(nullNode)) {
|
|
continue;
|
|
}
|
|
reportedNodes.add(nullNode);
|
|
|
|
const operator = sourceCode.getTokensBefore(nullNode, 2)[0];
|
|
|
|
if (!operator) {
|
|
return;
|
|
}
|
|
Check(expression, operator);
|
|
}
|
|
}
|
|
|
|
function evaluate(expression, nodes) {
|
|
if (!expression || expression.type !== "CallExpression") {
|
|
return true;
|
|
}
|
|
|
|
const whereNodes = nodes.filter((token) => token.value === "where");
|
|
|
|
if (whereNodes.length === 0 || !whereNodes) {
|
|
return;
|
|
}
|
|
|
|
if (whereNodes.length === 1) {
|
|
findNodes(expression, whereNodes[0], nodes);
|
|
|
|
return;
|
|
}
|
|
|
|
for (let i = 0; i < whereNodes.length; i++) {
|
|
const whereNode = whereNodes[i];
|
|
findNodes(expression, whereNode, nodes);
|
|
}
|
|
return;
|
|
}
|
|
},
|
|
};
|