mongo/buildscripts/eslint-plugin-mongodb/rules/no-printing-tojson.js

60 lines
1.9 KiB
JavaScript

const print_fns = [
"jsTestLog",
"jsTest.log",
"jsTest.log.info",
"jsTest.log.debug",
"jsTest.log.warning",
"jsTest.log.error",
"print",
];
function flattenMemberExpressionName(expr) {
if (expr.object.type == "MemberExpression") {
return flattenMemberExpressionName(expr.object) + "." + expr.property.name;
} else if (expr.object.type == "Identifier") {
return expr.object.name + "." + expr.property.name;
} else {
return "";
}
}
export default {
meta: {
type: "problem",
docs: {
description: "Ensure no calls like print(tojson(x))",
},
fixable: "code",
},
create(context) {
return {
CallExpression: function (node) {
if (node.callee.type == "MemberExpression") {
node.callee.name = flattenMemberExpressionName(node.callee);
} else if (node.callee.type != "Identifier") return;
if (print_fns.every((name) => name != node.callee.name)) return;
node.arguments.forEach((arg) => {
if (arg.type != "CallExpression") return;
if (arg.callee.type != "Identifier") return;
if (arg.callee.name != "tojson" && arg.callee.name != "tojsononeline") return;
context.report({
node,
message: `Calling ${arg.callee.name}() as a parameter of ${
node.callee.name
}(). Consider using toJsonForLog() instead or disable this rule by adding '// eslint-disable-next-line mongodb/no-printing-tojson'`,
fix(fixer) {
return fixer.replaceTextRange([arg.callee.start, arg.callee.end], "toJsonForLog");
},
});
});
},
};
},
};