53 lines
1.3 KiB
JavaScript
53 lines
1.3 KiB
JavaScript
|
|
//@ts-nocheck
|
||
|
|
module.exports = {
|
||
|
|
meta: {
|
||
|
|
type: "problem",
|
||
|
|
docs: {
|
||
|
|
description:
|
||
|
|
"Ensures that any call chain which affects a table also includes a 'where' clause.",
|
||
|
|
},
|
||
|
|
fixable: "code",
|
||
|
|
schema: [], // no options
|
||
|
|
},
|
||
|
|
create(context) {
|
||
|
|
const sourceCode = context.sourceCode;
|
||
|
|
|
||
|
|
if (!/\.updateTable\(|\.deleteFrom\(/.test(sourceCode.text)) {
|
||
|
|
// Skip
|
||
|
|
return {};
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
ExpressionStatement(node) {
|
||
|
|
evaluate(node.expression, sourceCode.getTokens(node));
|
||
|
|
},
|
||
|
|
AwaitExpression(node) {
|
||
|
|
evaluate(node.argument, sourceCode.getTokens(node));
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
function evaluate(expression, nodes) {
|
||
|
|
if (!expression || expression.type !== "CallExpression") {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
const hasUpdateOrDelete = nodes.some(
|
||
|
|
(token) =>
|
||
|
|
token.value === "updateTable" || token.value === "deleteFrom",
|
||
|
|
);
|
||
|
|
|
||
|
|
if (hasUpdateOrDelete) {
|
||
|
|
const hasWhere = nodes.some((token) => token.value === "where");
|
||
|
|
|
||
|
|
if (!hasWhere) {
|
||
|
|
const message = `Call chains containing "updateTable" or "deleteFrom" must also include a "where" clause.`;
|
||
|
|
context.report({
|
||
|
|
node: expression,
|
||
|
|
message,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
};
|