Skip to content

Commit

Permalink
feat: Add suggestions to no-console
Browse files Browse the repository at this point in the history
Fixes #17493
  • Loading branch information
Rec0iL99 committed Oct 27, 2023
1 parent 8651895 commit efb02e3
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 15 deletions.
28 changes: 26 additions & 2 deletions lib/rules/no-console.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,11 @@ module.exports = {
}
],

hasSuggestions: true,

messages: {
unexpected: "Unexpected console statement."
unexpected: "Unexpected console statement.",
removeConsole: "Remove the console.{{ propertyName }}()."
}
},

Expand Down Expand Up @@ -102,10 +105,31 @@ module.exports = {
function report(reference) {
const node = reference.identifier.parent;

const propertyName = astUtils.getStaticPropertyName(node);

context.report({
node,
loc: node.loc,
messageId: "unexpected"
messageId: "unexpected",
suggest: [
{
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
35 changes: 22 additions & 13 deletions tests/lib/rules/no-console.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,24 +40,33 @@ ruleTester.run("no-console", rule, {
invalid: [

// no options
{ code: "console.log(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.error(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.info(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.warn(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ 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" }] },

// one option
{ code: "console.log(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.error(foo)", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.info(foo)", options: [{ allow: ["log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.warn(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ 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" }] },

// multiple options
{ code: "console.log(foo)", options: [{ allow: ["warn", "info"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.error(foo)", options: [{ allow: ["warn", "info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.info(foo)", options: [{ allow: ["warn", "error", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ code: "console.warn(foo)", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] },
{ 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" }] },

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

0 comments on commit efb02e3

Please sign in to comment.