diff --git a/package.json b/package.json index 588b07c011..bdfee944ed 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "eslint": "^8.6.0", "eslint-ava-rule-tester": "^4.0.0", "eslint-plugin-eslint-plugin": "^4.1.0", + "eslint-plugin-internal-rules": "file:./scripts/internal-rules/", "eslint-remote-tester": "^2.0.1", "eslint-remote-tester-repositories": "^0.0.3", "execa": "^6.0.0", @@ -155,7 +156,30 @@ "eslint-plugin/require-meta-has-suggestions": "off", "eslint-plugin/require-meta-schema": "off" } + }, + { + "files": [ + "rules/**/*.js" + ], + "plugins": [ + "internal-rules" + ], + "rules": { + "internal-rules/prefer-negative-boolean-attribute": "error" + } } ] + }, + "npmpackagejsonlint": { + "rules": { + "prefer-caret-version-devDependencies": [ + "error", + { + "exceptions": [ + "eslint-plugin-internal-rules" + ] + } + ] + } } } diff --git a/rules/throw-new-error.js b/rules/throw-new-error.js index 20eeebdd4b..f61fbec497 100644 --- a/rules/throw-new-error.js +++ b/rules/throw-new-error.js @@ -22,7 +22,7 @@ const selector = [ // `throw lib.FooError()` [ '[callee.type="MemberExpression"]', - '[callee.computed=false]', + '[callee.computed!=true]', '[callee.property.type="Identifier"]', `[callee.property.name=/${customError.source}/]`, ].join(''), diff --git a/scripts/internal-rules/index.js b/scripts/internal-rules/index.js new file mode 100644 index 0000000000..0dad00081e --- /dev/null +++ b/scripts/internal-rules/index.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = { + rules: { + 'prefer-negative-boolean-attribute': require('./prefer-negative-boolean-attribute.js'), + }, +}; diff --git a/scripts/internal-rules/package.json b/scripts/internal-rules/package.json new file mode 100644 index 0000000000..8e71ca54a3 --- /dev/null +++ b/scripts/internal-rules/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "name": "eslint-plugin-internal-rules", + "description": "Internal rules", + "license": "MIT" +} diff --git a/scripts/internal-rules/prefer-negative-boolean-attribute.js b/scripts/internal-rules/prefer-negative-boolean-attribute.js new file mode 100644 index 0000000000..a448a3d648 --- /dev/null +++ b/scripts/internal-rules/prefer-negative-boolean-attribute.js @@ -0,0 +1,44 @@ +'use strict'; +const path = require('path'); + +const messageId = path.basename(__filename, '.js'); + +const shouldReport = (string, value) => { + const index = string.indexOf(`=${value}]`); + + if (index === -1) { + return false; + } + + return string[index - 1] !== '!'; +}; + +module.exports = { + create(context) { + return { + 'TemplateElement, Literal'(node) { + const string = node.value; + if (typeof string !== 'string') { + return; + } + + for (const value of [true, false]) { + if (shouldReport(string, value)) { + context.report({ + node, + messageId, + data: { + preferred: String(!value), + }, + }); + } + } + }, + }; + }, + meta: { + messages: { + [messageId]: 'Prefer use `[…!={{preferred}}]` in esquery selector.', + }, + }, +};