diff --git a/.eslintrc.yml b/.eslintrc.yml index 1527f90..61e768f 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,6 +1,6 @@ extends: - - plugin:@mysticatea/es2015 - - plugin:@mysticatea/+eslint-plugin + - plugin:@eslint-community/mysticatea/es2015 + - plugin:@eslint-community/mysticatea/+eslint-plugin overrides: - files: "docs/.vuepress/components/*.vue" @@ -9,6 +9,15 @@ overrides: - files: "lib/rules/*.js" rules: - "@mysticatea/eslint-plugin/require-meta-docs-url": + "@eslint-community/mysticatea/eslint-plugin/require-meta-docs-url": - error - pattern: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/{{name}}.html" + + - files: ["lib/configs.js", "lib/rules.js", "lib/utils.js"] + rules: + "@eslint-community/mysticatea/node/global-require": off + + - files: ["tests/**/*.js", "scripts/**/*.js"] + rules: + "@eslint-community/mysticatea/node/global-require": off + "@eslint-community/mysticatea/node/no-sync": off diff --git a/lib/internal/get-linters.js b/lib/internal/get-linters.js index 2482662..c85ecf3 100644 --- a/lib/internal/get-linters.js +++ b/lib/internal/get-linters.js @@ -10,13 +10,14 @@ const needle = `${path.sep}node_modules${path.sep}eslint${path.sep}` module.exports = () => { const eslintPaths = new Set( Object.keys(require.cache) - .filter(id => id.includes(needle)) - .map(id => id.slice(0, id.indexOf(needle) + needle.length)) + .filter((id) => id.includes(needle)) + .map((id) => id.slice(0, id.indexOf(needle) + needle.length)) ) const linters = [] for (const eslintPath of eslintPaths) { try { + // eslint-disable-next-line @eslint-community/mysticatea/node/global-require const linter = require(eslintPath).Linter if (linter) { diff --git a/lib/internal/utils.js b/lib/internal/utils.js index 849bb04..931d483 100644 --- a/lib/internal/utils.js +++ b/lib/internal/utils.js @@ -7,7 +7,8 @@ const escapeStringRegexp = require("escape-string-regexp") const LINE_PATTERN = /[^\r\n\u2028\u2029]*(?:\r\n|[\r\n\u2028\u2029]|$)/gu -const DIRECTIVE_PATTERN = /^(eslint(?:-env|-enable|-disable(?:(?:-next)?-line)?)?|exported|globals?)(?:\s|$)/u +const DIRECTIVE_PATTERN = + /^(eslint(?:-env|-enable|-disable(?:(?:-next)?-line)?)?|exported|globals?)(?:\s|$)/u const LINE_COMMENT_PATTERN = /^eslint-disable-(next-)?line$/u module.exports = { diff --git a/lib/rules/disable-enable-pair.js b/lib/rules/disable-enable-pair.js index de3a869..bb28be2 100644 --- a/lib/rules/disable-enable-pair.js +++ b/lib/rules/disable-enable-pair.js @@ -14,10 +14,14 @@ module.exports = { "require a `eslint-enable` comment for every `eslint-disable` comment", category: "Best Practices", recommended: true, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/disable-enable-pair.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/disable-enable-pair.html", }, fixable: null, + messages: { + missingPair: "Requires 'eslint-enable' directive.", + missingRulePair: + "Requires 'eslint-enable' directive for '{{ruleId}}'.", + }, schema: [ { type: "object", @@ -57,9 +61,9 @@ module.exports = { context.report({ loc: utils.toRuleIdLocation(area.comment, area.ruleId), - message: area.ruleId - ? "Requires 'eslint-enable' directive for '{{ruleId}}'." - : "Requires 'eslint-enable' directive.", + messageId: area.ruleId + ? "missingRulePair" + : "missingPair", data: area, }) } diff --git a/lib/rules/no-aggregating-enable.js b/lib/rules/no-aggregating-enable.js index 7eff376..6f34616 100644 --- a/lib/rules/no-aggregating-enable.js +++ b/lib/rules/no-aggregating-enable.js @@ -14,10 +14,13 @@ module.exports = { "disallow a `eslint-enable` comment for multiple `eslint-disable` comments", category: "Best Practices", recommended: true, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-aggregating-enable.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-aggregating-enable.html", }, fixable: null, + messages: { + aggregatingEnable: + "This `eslint-enable` comment affects {{count}} `eslint-disable` comments. An `eslint-enable` comment should be for an `eslint-disable` comment.", + }, schema: [], type: "suggestion", }, @@ -35,8 +38,7 @@ module.exports = { if (count >= 2) { context.report({ loc: utils.toForceLocation(comment.loc), - message: - "This `eslint-enable` comment affects {{count}} `eslint-disable` comments. An `eslint-enable` comment should be for an `eslint-disable` comment.", + messageId: "aggregatingEnable", data: { count }, }) } diff --git a/lib/rules/no-duplicate-disable.js b/lib/rules/no-duplicate-disable.js index c6777f8..f5e7846 100644 --- a/lib/rules/no-duplicate-disable.js +++ b/lib/rules/no-duplicate-disable.js @@ -13,10 +13,13 @@ module.exports = { description: "disallow duplicate `eslint-disable` comments", category: "Best Practices", recommended: true, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-duplicate-disable.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-duplicate-disable.html", }, fixable: null, + messages: { + duplicate: "ESLint rules have been disabled already.", + duplicateRule: "'{{ruleId}}' rule has been disabled already.", + }, schema: [], type: "problem", }, @@ -30,9 +33,7 @@ module.exports = { for (const item of disabledArea.duplicateDisableDirectives) { context.report({ loc: utils.toRuleIdLocation(item.comment, item.ruleId), - message: item.ruleId - ? "'{{ruleId}}' rule has been disabled already." - : "ESLint rules have been disabled already.", + messageId: item.ruleId ? "duplicateRule" : "duplicate", data: item, }) } diff --git a/lib/rules/no-restricted-disable.js b/lib/rules/no-restricted-disable.js index a20c7af..a620d50 100644 --- a/lib/rules/no-restricted-disable.js +++ b/lib/rules/no-restricted-disable.js @@ -15,10 +15,12 @@ module.exports = { "disallow `eslint-disable` comments about specific rules", category: "Stylistic Issues", recommended: false, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-restricted-disable.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-restricted-disable.html", }, fixable: null, + messages: { + disallow: "Disabling '{{ruleId}}' is not allowed.", + }, schema: { type: "array", items: { type: "string" }, @@ -49,7 +51,7 @@ module.exports = { area.comment, area.ruleId ), - message: "Disabling '{{ruleId}}' is not allowed.", + messageId: "disallow", data: { ruleId: area.ruleId || String(context.options), }, diff --git a/lib/rules/no-unlimited-disable.js b/lib/rules/no-unlimited-disable.js index 39dd22e..942c6d3 100644 --- a/lib/rules/no-unlimited-disable.js +++ b/lib/rules/no-unlimited-disable.js @@ -13,10 +13,13 @@ module.exports = { "disallow `eslint-disable` comments without rule names", category: "Best Practices", recommended: true, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-unlimited-disable.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-unlimited-disable.html", }, fixable: null, + messages: { + unexpected: + "Unexpected unlimited '{{kind}}' comment. Specify some rule names to disable.", + }, schema: [], type: "suggestion", }, @@ -27,9 +30,8 @@ module.exports = { return { Program() { for (const comment of sourceCode.getAllComments()) { - const directiveComment = utils.parseDirectiveComment( - comment - ) + const directiveComment = + utils.parseDirectiveComment(comment) if (directiveComment == null) { continue } @@ -45,8 +47,7 @@ module.exports = { if (!directiveComment.value) { context.report({ loc: utils.toForceLocation(comment.loc), - message: - "Unexpected unlimited '{{kind}}' comment. Specify some rule names to disable.", + messageId: "unexpected", data: { kind: directiveComment.kind }, }) } diff --git a/lib/rules/no-unused-disable.js b/lib/rules/no-unused-disable.js index f14126a..64d1e40 100644 --- a/lib/rules/no-unused-disable.js +++ b/lib/rules/no-unused-disable.js @@ -13,10 +13,11 @@ module.exports = { description: "disallow unused `eslint-disable` comments", category: "Best Practices", recommended: false, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-unused-disable.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-unused-disable.html", }, fixable: null, + // eslint-disable-next-line @eslint-community/mysticatea/eslint-plugin/prefer-message-ids + messages: {}, schema: [], type: "problem", }, diff --git a/lib/rules/no-unused-enable.js b/lib/rules/no-unused-enable.js index 88b6a34..39feec1 100644 --- a/lib/rules/no-unused-enable.js +++ b/lib/rules/no-unused-enable.js @@ -13,10 +13,14 @@ module.exports = { description: "disallow unused `eslint-enable` comments", category: "Best Practices", recommended: true, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-unused-enable.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-unused-enable.html", }, fixable: null, + messages: { + unused: "ESLint rules are re-enabled but those have not been disabled.", + unusedRule: + "'{{ruleId}}' rule is re-enabled but it has not been disabled.", + }, schema: [], type: "problem", }, @@ -30,9 +34,7 @@ module.exports = { for (const item of disabledArea.unusedEnableDirectives) { context.report({ loc: utils.toRuleIdLocation(item.comment, item.ruleId), - message: item.ruleId - ? "'{{ruleId}}' rule is re-enabled but it has not been disabled." - : "ESLint rules are re-enabled but those have not been disabled.", + messageId: item.ruleId ? "unusedRule" : "unused", data: item, }) } diff --git a/lib/rules/no-use.js b/lib/rules/no-use.js index 6ccf308..99f841f 100644 --- a/lib/rules/no-use.js +++ b/lib/rules/no-use.js @@ -12,10 +12,12 @@ module.exports = { description: "disallow ESLint directive-comments", category: "Stylistic Issues", recommended: false, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-use.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-use.html", }, fixable: null, + messages: { + disallow: "Unexpected ESLint directive comment.", + }, schema: [ { type: "object", @@ -54,9 +56,8 @@ module.exports = { return { Program() { for (const comment of sourceCode.getAllComments()) { - const directiveComment = utils.parseDirectiveComment( - comment - ) + const directiveComment = + utils.parseDirectiveComment(comment) if (directiveComment == null) { continue } @@ -64,7 +65,7 @@ module.exports = { if (!allowed.has(directiveComment.kind)) { context.report({ loc: utils.toForceLocation(comment.loc), - message: "Unexpected ESLint directive comment.", + messageId: "disallow", }) } } diff --git a/lib/rules/require-description.js b/lib/rules/require-description.js index dad77d7..b751aef 100644 --- a/lib/rules/require-description.js +++ b/lib/rules/require-description.js @@ -13,10 +13,13 @@ module.exports = { "require include descriptions in ESLint directive-comments", category: "Stylistic Issues", recommended: false, - url: - "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/require-description.html", + url: "https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/require-description.html", }, fixable: null, + messages: { + missingDescription: + "Unexpected undescribed directive comment. Include descriptions to explain why the comment is necessary.", + }, schema: [ { type: "object", @@ -55,9 +58,8 @@ module.exports = { return { Program() { for (const comment of sourceCode.getAllComments()) { - const directiveComment = utils.parseDirectiveComment( - comment - ) + const directiveComment = + utils.parseDirectiveComment(comment) if (directiveComment == null) { continue } @@ -67,8 +69,7 @@ module.exports = { if (!directiveComment.description) { context.report({ loc: utils.toForceLocation(comment.loc), - message: - "Unexpected undescribed directive comment. Include descriptions to explain why the comment is necessary.", + messageId: "missingDescription", }) } } diff --git a/package.json b/package.json index 96d5508..9e2e01a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "ignore": "^5.2.4" }, "devDependencies": { - "@mysticatea/eslint-plugin": "^13.0.0", + "@eslint-community/eslint-plugin-mysticatea": "^15.5.1", "@types/node": "^14.18.36", "@vuepress/plugin-pwa": "^1.9.8", "babel-eslint": "^10.0.1", diff --git a/scripts/lib/rules.js b/scripts/lib/rules.js index 8b795bf..f9cc745 100644 --- a/scripts/lib/rules.js +++ b/scripts/lib/rules.js @@ -12,8 +12,8 @@ const path = require("path") */ const rules = fs .readdirSync(path.resolve(__dirname, "../../lib/rules")) - .map(fileName => path.basename(fileName, ".js")) - .map(name => { + .map((fileName) => path.basename(fileName, ".js")) + .map((name) => { const meta = require(`../../lib/rules/${name}`).meta return { id: `@eslint-community/eslint-comments/${name}`, @@ -29,10 +29,10 @@ const rules = fs module.exports = rules module.exports.withCategories = ["Best Practices", "Stylistic Issues"].map( - category => ({ + (category) => ({ category, rules: rules.filter( - rule => rule.category === category && !rule.deprecated + (rule) => rule.category === category && !rule.deprecated ), }) ) diff --git a/scripts/lib/utils.js b/scripts/lib/utils.js index 504c123..a3e0f9a 100644 --- a/scripts/lib/utils.js +++ b/scripts/lib/utils.js @@ -31,8 +31,8 @@ function createIndex(dirPath) { module.exports = { ${fs .readdirSync(dirPath) - .map(file => path.basename(file, ".js")) - .map(id => `"${id}": require("./${dirName}/${id}"),`) + .map((file) => path.basename(file, ".js")) + .map((id) => `"${id}": require("./${dirName}/${id}"),`) .join("\n ")} } `) diff --git a/scripts/update-docs-headers.js b/scripts/update-docs-headers.js index 4942984..c73170d 100644 --- a/scripts/update-docs-headers.js +++ b/scripts/update-docs-headers.js @@ -19,7 +19,7 @@ for (const rule of rules) { if (rule.deprecated) { headerLines.push( `- ⚠️ This rule was **deprecated** and replaced by ${rule.replacedBy - .map(id => `[${id}](${id}.md) rule`) + .map((id) => `[${id}](${id}.md) rule`) .join(", ")}.` ) } else if (rule.recommended) { diff --git a/scripts/update-recommended-rules.js b/scripts/update-recommended-rules.js index 10400cb..ebaaed6 100644 --- a/scripts/update-recommended-rules.js +++ b/scripts/update-recommended-rules.js @@ -19,8 +19,8 @@ module.exports = { plugins: ["@eslint-community/eslint-comments"], rules: { ${rules - .filter(rule => rule.recommended) - .map(rule => `"${rule.id}": "error",`) + .filter((rule) => rule.recommended) + .map((rule) => `"${rule.id}": "error",`) .join("\n ")} }, } diff --git a/scripts/update.js b/scripts/update.js index 9eec691..7e45f8c 100644 --- a/scripts/update.js +++ b/scripts/update.js @@ -21,7 +21,7 @@ for (const dirPath of [ path.resolve(__dirname, "../lib/rules"), path.resolve(__dirname, "../lib/utils"), ]) { - createIndex(dirPath).then(content => + createIndex(dirPath).then((content) => fs.writeFileSync(`${dirPath}.js`, content) ) } diff --git a/tests/lib/illegal-eslint-disable-line.js b/tests/lib/illegal-eslint-disable-line.js index 8a45958..9abe5f3 100644 --- a/tests/lib/illegal-eslint-disable-line.js +++ b/tests/lib/illegal-eslint-disable-line.js @@ -33,7 +33,7 @@ function runESLint(code) { const chunks = [] let totalLength = 0 - cp.stdout.on("data", chunk => { + cp.stdout.on("data", (chunk) => { chunks.push(chunk) totalLength += chunk.length }) @@ -61,12 +61,9 @@ describe("multi-line eslint-disable-line comments", () => { "../../node_modules/@eslint-community/eslint-plugin-eslint-comments" ) + fs.mkdirSync(path.dirname(pluginPath), { recursive: true }) if (fs.existsSync(pluginPath)) { rimraf.sync(pluginPath) - } else { - fs.mkdirSync( - path.resolve(__dirname, "../../node_modules/@eslint-community") - ) } fs.symlinkSync(selfPath, pluginPath, "junction") @@ -86,10 +83,10 @@ no-undef*/ `, ]) { it(code, () => - runESLint(code).then(messages => { + runESLint(code).then((messages) => { assert.strictEqual(messages.length > 0, true) const normalMessages = messages.filter( - message => message.ruleId != null + (message) => message.ruleId != null ) assert.strictEqual(normalMessages.length, 0) }) diff --git a/tests/lib/rules/no-restricted-disable.js b/tests/lib/rules/no-restricted-disable.js index d541e7c..e24370d 100644 --- a/tests/lib/rules/no-restricted-disable.js +++ b/tests/lib/rules/no-restricted-disable.js @@ -137,8 +137,7 @@ tester.run("no-restricted-disable", rule, { }, { - code: - "/*eslint-disable semi, no-extra-semi, semi-style, comma-style*/", + code: "/*eslint-disable semi, no-extra-semi, semi-style, comma-style*/", options: ["*semi*"], errors: [ "Disabling 'semi' is not allowed.", @@ -147,8 +146,7 @@ tester.run("no-restricted-disable", rule, { ], }, { - code: - "/*eslint-disable no-undef, no-redeclare, foo/no-undef, foo/no-redeclare*/", + code: "/*eslint-disable no-undef, no-redeclare, foo/no-undef, foo/no-redeclare*/", options: ["foo/*"], errors: [ "Disabling 'foo/no-undef' is not allowed.", diff --git a/tests/lib/rules/no-unused-disable.js b/tests/lib/rules/no-unused-disable.js index 68eb741..86ca225 100644 --- a/tests/lib/rules/no-unused-disable.js +++ b/tests/lib/rules/no-unused-disable.js @@ -52,7 +52,7 @@ function runESLint(code, reportUnusedDisableDirectives = false) { const chunks = [] let totalLength = 0 - cp.stdout.on("data", chunk => { + cp.stdout.on("data", (chunk) => { chunks.push(chunk) totalLength += chunk.length }) @@ -80,15 +80,9 @@ describe("no-unused-disable", () => { "../../../node_modules/@eslint-community/eslint-plugin-eslint-comments" ) + fs.mkdirSync(path.dirname(pluginPath), { recursive: true }) if (fs.existsSync(pluginPath)) { rimraf.sync(pluginPath) - } else { - fs.mkdirSync( - path.resolve( - __dirname, - "../../../node_modules/@eslint-community" - ) - ) } fs.symlinkSync(selfPath, pluginPath, "junction") @@ -177,7 +171,7 @@ var a = b //eslint-disable-line -- description`, : []), ]) { it(code, () => - runESLint(code).then(messages => { + runESLint(code).then((messages) => { assert.strictEqual(messages.length, 0) }) ) @@ -718,8 +712,7 @@ var a = b ], }, { - code: - "/* eslint new-parens:error*/ /*eslint-disable new-parens*/", + code: "/* eslint new-parens:error*/ /*eslint-disable new-parens*/", errors: [ { message: @@ -856,8 +849,7 @@ var a = b //eslint-disable-line -- description`, // Don't crash even if the source code has a parse error. { - code: - "/*eslint no-undef:error*/\nvar a = b c //eslint-disable-line no-undef", + code: "/*eslint no-undef:error*/\nvar a = b c //eslint-disable-line no-undef", errors: [ { message: "Parsing error: Unexpected token c", @@ -867,7 +859,7 @@ var a = b //eslint-disable-line -- description`, ]) { it(code, () => runESLint(code, reportUnusedDisableDirectives).then( - actualMessages => { + (actualMessages) => { assert.strictEqual(actualMessages.length, errors.length) for (let i = 0; i < errors.length; ++i) { const actual = actualMessages[i]