infoalloggi-monorepo/apps/infoalloggi/kyselyRules/rules/null.js
2025-08-04 17:45:44 +02:00

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;
}
},
};