The rule we want to write is show warning if user using console method:
// valid foo.console() console() info() console.baz() // invalid console.log() console.info() console.warn()
Rule:
const disallowedMethods = ["log", "info", "warn", "error", "dir"]; module.exports = { meta: { docs: { description: "Disallow use of console", category: "Best Practices", recommended: true } }, create(context) { return { Identifier(node) { const isConsoleCall = looksLike(node, { name: "console", parent: { type: "MemberExpression", property: { name: val => disallowedMethods.includes(val) } } }); // find the identifier with name 'console' if (!isConsoleCall) { return; } context.report({ node, message: "Using console is not allowed" }); } }; } }; function looksLike(a, b) { return ( a && b && Object.keys(b).every(bKey => { const bVal = b[bKey]; const aVal = a[bKey]; if (typeof bVal === "function") { return bVal(aVal); } return isPrimitive(bVal) ? bVal === aVal : looksLike(aVal, bVal); }) ); } function isPrimitive(val) { return val == null || /^[sbn]/.test(typeof val); }
'looksLike' & isPrimitive is pretty handy, you can save as until lib.