Skip to content

Commit

Permalink
Fix method of when to show safe suggestions and fix tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
Rec0iL99 committed Oct 26, 2023
1 parent 402ccff commit 71418eb
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 36 deletions.
34 changes: 20 additions & 14 deletions lib/rules/no-console.js
Expand Up @@ -97,6 +97,22 @@ module.exports = {
);
}

/**
* Checks if it is safe to provide suggestions for the specific node.
* @param {ASTNode} node The MemberExpression node to check.
* @returns {boolean} `true` if the node is safe to be fixed via a suggestion
*/
function isSafeToProvideSuggestions(node) {
const isInStatementListParents = astUtils.STATEMENT_LIST_PARENTS.has(node.parent.parent.parent.type);

return (
isInStatementListParents &&
node.parent.type === "CallExpression" &&
node.parent.callee === node &&
node.parent.parent.type === "ExpressionStatement"
);
}

/**
* Reports the given reference as a violation.
* @param {eslint-scope.Reference} reference The reference to report.
Expand All @@ -111,25 +127,15 @@ module.exports = {
node,
loc: node.loc,
messageId: "unexpected",
suggest: [
{
suggest: isSafeToProvideSuggestions(node)
? [{
messageId: "removeConsole",
data: { propertyName },
fix(fixer) {
const copyOfStatementListParents = astUtils.STATEMENT_LIST_PARENTS;

copyOfStatementListParents.delete("Program");

const isNotFixable = copyOfStatementListParents.has(node.parent.parent.parent.type);

if (isNotFixable) {
return null;
}

return fixer.removeRange(node.parent.parent.range);
}
}
]
}]
: []
});
}

Expand Down
50 changes: 28 additions & 22 deletions tests/lib/rules/no-console.js
Expand Up @@ -40,33 +40,39 @@ ruleTester.run("no-console", rule, {
invalid: [

// no options
{ code: "console.log(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.error(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.info(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.warn(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "switch (a) { case 1: console.log(foo) }", errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "if (a) { console.warn(foo) }", errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "class A { static { console.info(foo) } }", parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.log(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "" }] }] },
{ code: "console.error(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "" }] }] },
{ code: "console.info(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "" }] }] },
{ code: "console.warn(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "warn" }, output: "" }] }] },
{ code: "switch (a) { case 1: console.log(foo) }", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "switch (a) { case 1: }" }] }] },
{ code: "if (a) { console.warn(foo) }", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "warn" }, output: "if (a) { }" }] }] },
{ code: "if (a) console.warn(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "foo(console.log)", errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "class A { static { console.info(foo) } }", parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "class A { static { } }" }] }] },

// one option
{ code: "console.log(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.error(foo)", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.info(foo)", options: [{ allow: ["log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.warn(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "switch (a) { case 1: console.log(foo) }", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "if (a) { console.info(foo) }", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "class A { static { console.error(foo) } }", options: [{ allow: ["log"] }], parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.log(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "" }] }] },
{ code: "console.error(foo)", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "" }] }] },
{ code: "console.info(foo)", options: [{ allow: ["log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "" }] }] },
{ code: "console.warn(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "warn" }, output: "" }] }] },
{ code: "switch (a) { case 1: console.log(foo) }", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "switch (a) { case 1: }" }] }] },
{ code: "if (a) { console.info(foo) }", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "if (a) { }" }] }] },
{ code: "if (a) console.info(foo)", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "foo(console.warn)", options: [{ allow: ["log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "class A { static { console.error(foo) } }", options: [{ allow: ["log"] }], parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "class A { static { } }" }] }] },

// multiple options
{ code: "console.log(foo)", options: [{ allow: ["warn", "info"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.error(foo)", options: [{ allow: ["warn", "info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.info(foo)", options: [{ allow: ["warn", "error", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "console.warn(foo)", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] },
{ code: "switch (a) { case 1: console.error(foo) }", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "if (a) { console.log(foo) }", options: [{ allow: ["warn", "error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "class A { static { console.info(foo) } }", options: [{ allow: ["log", "error", "warn"] }], parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.log(foo)", options: [{ allow: ["warn", "info"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "" }] }] },
{ code: "console.error(foo)", options: [{ allow: ["warn", "info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "" }] }] },
{ code: "console.info(foo)", options: [{ allow: ["warn", "error", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "" }] }] },
{ code: "console.warn(foo)", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "warn" }, output: "" }] }] },
{ code: "switch (a) { case 1: console.error(foo) }", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "switch (a) { case 1: }" }] }] },
{ code: "if (a) { console.log(foo) }", options: [{ allow: ["warn", "error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "if (a) { }" }] }] },
{ code: "if (a) console.log(foo)", options: [{ allow: ["warn", "error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "foo(console.info)", options: [{ allow: ["warn", "error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "class A { static { console.info(foo) } }", options: [{ allow: ["log", "error", "warn"] }], parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "class A { static { } }" }] }] },

// In case that implicit global variable of 'console' exists
{ code: "console.log(foo)", env: { node: true }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }
{ code: "console.log(foo)", env: { node: true }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "" }] }] }
]
});

0 comments on commit 71418eb

Please sign in to comment.