diff --git a/package.json b/package.json index 6c0a62e6..bc008178 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "eslint-config-prettier": "~8.5.0", "eslint-gitignore": "~0.1.0", "eslint-plugin-deprecation": "~1.3.3", + "eslint-plugin-eslint-comments": "~3.2.0", "eslint-plugin-import": "~2.26.0", "eslint-plugin-inclusive-language": "~2.2.0", "eslint-plugin-jsdoc": "~39.6.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17ebd6b9..9b33555d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,7 @@ specifiers: eslint-config-prettier: ~8.5.0 eslint-gitignore: ~0.1.0 eslint-plugin-deprecation: ~1.3.3 + eslint-plugin-eslint-comments: ~3.2.0 eslint-plugin-import: ~2.26.0 eslint-plugin-inclusive-language: ~2.2.0 eslint-plugin-jsdoc: ~39.6.4 @@ -54,6 +55,7 @@ devDependencies: eslint-config-prettier: 8.5.0_eslint@8.31.0 eslint-gitignore: 0.1.0_eslint@8.31.0 eslint-plugin-deprecation: 1.3.3_iukboom6ndih5an6iafl45j2fe + eslint-plugin-eslint-comments: 3.2.0_eslint@8.31.0 eslint-plugin-import: 2.26.0_ejk3zt536nc2nr7uicalblhboi eslint-plugin-inclusive-language: 2.2.0 eslint-plugin-jsdoc: 39.6.4_eslint@8.31.0 @@ -1753,6 +1755,17 @@ packages: regexpp: 3.2.0 dev: true + /eslint-plugin-eslint-comments/3.2.0_eslint@8.31.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.31.0 + ignore: 5.2.4 + dev: true + /eslint-plugin-import/2.26.0_ejk3zt536nc2nr7uicalblhboi: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} diff --git a/scripts/generate-rule-files/src/plugins-map.ts b/scripts/generate-rule-files/src/plugins-map.ts index a84fdd65..00848628 100644 --- a/scripts/generate-rule-files/src/plugins-map.ts +++ b/scripts/generate-rule-files/src/plugins-map.ts @@ -1,6 +1,8 @@ import * as eslint from 'eslint'; import * as eslintPluginDeprecation from 'eslint-plugin-deprecation'; // @ts-expect-error +import eslintPluginEslintComments from 'eslint-plugin-eslint-comments'; +// @ts-expect-error import * as eslintPluginImport from 'eslint-plugin-import'; // @ts-expect-error import eslintPluginJSDoc from 'eslint-plugin-jsdoc'; @@ -50,6 +52,10 @@ export const PLUGIN_REGISTRY: Readonly> = { name: 'Import', rules: (eslintPluginImport as Plugin).rules, }, + 'eslint-comments': { + name: 'EslintComments', + rules: (eslintPluginEslintComments as Plugin).rules, + }, jsdoc: { name: 'JSDoc', prefix: 'jsdoc', @@ -57,7 +63,6 @@ export const PLUGIN_REGISTRY: Readonly> = { }, jsonc: { name: 'Jsonc', - prefix: 'jsonc', rules: // @ts-expect-error: throw error when plugin successfully updated their type defs eslintPluginJsonc.rules as Plugin['rules'], diff --git a/src/config/extends/eslint-plugin-eslint-comment.d.ts b/src/config/extends/eslint-plugin-eslint-comment.d.ts new file mode 100644 index 00000000..09263725 --- /dev/null +++ b/src/config/extends/eslint-plugin-eslint-comment.d.ts @@ -0,0 +1,6 @@ +/** + * Eslint EslintComments extensions. + * + * @see [Eslint EslintComments extensions](https://mysticatea.github.io/eslint-plugin-eslint-comments/#%F0%9F%93%96-usage) + */ +export type EslintCommentsExtensions = 'plugin:eslint-comments/recommended'; diff --git a/src/config/extends/index.d.ts b/src/config/extends/index.d.ts index fe9eabc3..bfc589e1 100644 --- a/src/config/extends/index.d.ts +++ b/src/config/extends/index.d.ts @@ -1,5 +1,6 @@ import type { LiteralUnion } from '../../utility-types'; import type { EslintExtensions } from './eslint'; +import type { EslintCommentsExtensions } from './eslint-plugin-eslint-comment'; import type { ImportExtensions } from './eslint-plugin-import'; import type { JsdocExtensions } from './eslint-plugin-jsdoc'; import type { JsoncExtensions } from './eslint-plugin-jsonc'; @@ -19,6 +20,7 @@ import type { TypescriptEslintExtensions } from './typescript-eslint'; * All known extensions. */ export type KnownExtensions = LiteralUnion< + | EslintCommentsExtensions | EslintExtensions | ImportExtensions | IntlifyVueI18nExtensions diff --git a/src/rules/eslint-comments/disable-enable-pair.d.ts b/src/rules/eslint-comments/disable-enable-pair.d.ts new file mode 100644 index 00000000..4a8531dd --- /dev/null +++ b/src/rules/eslint-comments/disable-enable-pair.d.ts @@ -0,0 +1,34 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Option. + */ +export interface DisableEnablePairOption { + allowWholeFile?: boolean; +} + +/** + * Options. + */ +export type DisableEnablePairOptions = [DisableEnablePairOption?]; + +/** + * Require a `eslint-enable` comment for every `eslint-disable` comment. + * + * @see [disable-enable-pair](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/disable-enable-pair.html) + */ +export type DisableEnablePairRuleConfig = RuleConfig; + +/** + * Require a `eslint-enable` comment for every `eslint-disable` comment. + * + * @see [disable-enable-pair](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/disable-enable-pair.html) + */ +export interface DisableEnablePairRule { + /** + * Require a `eslint-enable` comment for every `eslint-disable` comment. + * + * @see [disable-enable-pair](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/disable-enable-pair.html) + */ + 'eslint-comments/disable-enable-pair': DisableEnablePairRuleConfig; +} diff --git a/src/rules/eslint-comments/index.d.ts b/src/rules/eslint-comments/index.d.ts new file mode 100644 index 00000000..7a8eac43 --- /dev/null +++ b/src/rules/eslint-comments/index.d.ts @@ -0,0 +1,22 @@ +import type { DisableEnablePairRule } from './disable-enable-pair'; +import type { NoAggregatingEnableRule } from './no-aggregating-enable'; +import type { NoDuplicateDisableRule } from './no-duplicate-disable'; +import type { NoRestrictedDisableRule } from './no-restricted-disable'; +import type { NoUnlimitedDisableRule } from './no-unlimited-disable'; +import type { NoUnusedDisableRule } from './no-unused-disable'; +import type { NoUnusedEnableRule } from './no-unused-enable'; +import type { NoUseRule } from './no-use'; +import type { RequireDescriptionRule } from './require-description'; + +/** + * All EslintComments rules. + */ +export type EslintCommentsRules = DisableEnablePairRule & + NoAggregatingEnableRule & + NoDuplicateDisableRule & + NoRestrictedDisableRule & + NoUnlimitedDisableRule & + NoUnusedDisableRule & + NoUnusedEnableRule & + NoUseRule & + RequireDescriptionRule; diff --git a/src/rules/eslint-comments/no-aggregating-enable.d.ts b/src/rules/eslint-comments/no-aggregating-enable.d.ts new file mode 100644 index 00000000..f8a3e387 --- /dev/null +++ b/src/rules/eslint-comments/no-aggregating-enable.d.ts @@ -0,0 +1,22 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Disallow a `eslint-enable` comment for multiple `eslint-disable` comments. + * + * @see [no-aggregating-enable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-aggregating-enable.html) + */ +export type NoAggregatingEnableRuleConfig = RuleConfig<[]>; + +/** + * Disallow a `eslint-enable` comment for multiple `eslint-disable` comments. + * + * @see [no-aggregating-enable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-aggregating-enable.html) + */ +export interface NoAggregatingEnableRule { + /** + * Disallow a `eslint-enable` comment for multiple `eslint-disable` comments. + * + * @see [no-aggregating-enable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-aggregating-enable.html) + */ + 'eslint-comments/no-aggregating-enable': NoAggregatingEnableRuleConfig; +} diff --git a/src/rules/eslint-comments/no-duplicate-disable.d.ts b/src/rules/eslint-comments/no-duplicate-disable.d.ts new file mode 100644 index 00000000..82c9f11d --- /dev/null +++ b/src/rules/eslint-comments/no-duplicate-disable.d.ts @@ -0,0 +1,22 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Disallow duplicate `eslint-disable` comments. + * + * @see [no-duplicate-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-duplicate-disable.html) + */ +export type NoDuplicateDisableRuleConfig = RuleConfig<[]>; + +/** + * Disallow duplicate `eslint-disable` comments. + * + * @see [no-duplicate-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-duplicate-disable.html) + */ +export interface NoDuplicateDisableRule { + /** + * Disallow duplicate `eslint-disable` comments. + * + * @see [no-duplicate-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-duplicate-disable.html) + */ + 'eslint-comments/no-duplicate-disable': NoDuplicateDisableRuleConfig; +} diff --git a/src/rules/eslint-comments/no-restricted-disable.d.ts b/src/rules/eslint-comments/no-restricted-disable.d.ts new file mode 100644 index 00000000..4e366d6a --- /dev/null +++ b/src/rules/eslint-comments/no-restricted-disable.d.ts @@ -0,0 +1,33 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Option. + */ +export type NoRestrictedDisableOption = string[]; + +/** + * Options. + */ +export type NoRestrictedDisableOptions = NoRestrictedDisableOption; + +/** + * Disallow `eslint-disable` comments about specific rules. + * + * @see [no-restricted-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-restricted-disable.html) + */ +export type NoRestrictedDisableRuleConfig = + RuleConfig; + +/** + * Disallow `eslint-disable` comments about specific rules. + * + * @see [no-restricted-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-restricted-disable.html) + */ +export interface NoRestrictedDisableRule { + /** + * Disallow `eslint-disable` comments about specific rules. + * + * @see [no-restricted-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-restricted-disable.html) + */ + 'eslint-comments/no-restricted-disable': NoRestrictedDisableRuleConfig; +} diff --git a/src/rules/eslint-comments/no-unlimited-disable.d.ts b/src/rules/eslint-comments/no-unlimited-disable.d.ts new file mode 100644 index 00000000..d6ed1b87 --- /dev/null +++ b/src/rules/eslint-comments/no-unlimited-disable.d.ts @@ -0,0 +1,22 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Disallow `eslint-disable` comments without rule names. + * + * @see [no-unlimited-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unlimited-disable.html) + */ +export type NoUnlimitedDisableRuleConfig = RuleConfig<[]>; + +/** + * Disallow `eslint-disable` comments without rule names. + * + * @see [no-unlimited-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unlimited-disable.html) + */ +export interface NoUnlimitedDisableRule { + /** + * Disallow `eslint-disable` comments without rule names. + * + * @see [no-unlimited-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unlimited-disable.html) + */ + 'eslint-comments/no-unlimited-disable': NoUnlimitedDisableRuleConfig; +} diff --git a/src/rules/eslint-comments/no-unused-disable.d.ts b/src/rules/eslint-comments/no-unused-disable.d.ts new file mode 100644 index 00000000..96d24be4 --- /dev/null +++ b/src/rules/eslint-comments/no-unused-disable.d.ts @@ -0,0 +1,22 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Disallow unused `eslint-disable` comments. + * + * @see [no-unused-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unused-disable.html) + */ +export type NoUnusedDisableRuleConfig = RuleConfig<[]>; + +/** + * Disallow unused `eslint-disable` comments. + * + * @see [no-unused-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unused-disable.html) + */ +export interface NoUnusedDisableRule { + /** + * Disallow unused `eslint-disable` comments. + * + * @see [no-unused-disable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unused-disable.html) + */ + 'eslint-comments/no-unused-disable': NoUnusedDisableRuleConfig; +} diff --git a/src/rules/eslint-comments/no-unused-enable.d.ts b/src/rules/eslint-comments/no-unused-enable.d.ts new file mode 100644 index 00000000..2cc8f6a3 --- /dev/null +++ b/src/rules/eslint-comments/no-unused-enable.d.ts @@ -0,0 +1,22 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Disallow unused `eslint-enable` comments. + * + * @see [no-unused-enable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unused-enable.html) + */ +export type NoUnusedEnableRuleConfig = RuleConfig<[]>; + +/** + * Disallow unused `eslint-enable` comments. + * + * @see [no-unused-enable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unused-enable.html) + */ +export interface NoUnusedEnableRule { + /** + * Disallow unused `eslint-enable` comments. + * + * @see [no-unused-enable](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-unused-enable.html) + */ + 'eslint-comments/no-unused-enable': NoUnusedEnableRuleConfig; +} diff --git a/src/rules/eslint-comments/no-use.d.ts b/src/rules/eslint-comments/no-use.d.ts new file mode 100644 index 00000000..105834dc --- /dev/null +++ b/src/rules/eslint-comments/no-use.d.ts @@ -0,0 +1,44 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Option. + */ +export interface NoUseOption { + allow?: ( + | 'eslint' + | 'eslint-disable' + | 'eslint-disable-line' + | 'eslint-disable-next-line' + | 'eslint-enable' + | 'eslint-env' + | 'exported' + | 'global' + | 'globals' + )[]; +} + +/** + * Options. + */ +export type NoUseOptions = [NoUseOption?]; + +/** + * Disallow ESLint directive-comments. + * + * @see [no-use](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-use.html) + */ +export type NoUseRuleConfig = RuleConfig; + +/** + * Disallow ESLint directive-comments. + * + * @see [no-use](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-use.html) + */ +export interface NoUseRule { + /** + * Disallow ESLint directive-comments. + * + * @see [no-use](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/no-use.html) + */ + 'eslint-comments/no-use': NoUseRuleConfig; +} diff --git a/src/rules/eslint-comments/require-description.d.ts b/src/rules/eslint-comments/require-description.d.ts new file mode 100644 index 00000000..70c3ea12 --- /dev/null +++ b/src/rules/eslint-comments/require-description.d.ts @@ -0,0 +1,45 @@ +import type { RuleConfig } from '../rule-config'; + +/** + * Option. + */ +export interface RequireDescriptionOption { + ignore?: ( + | 'eslint' + | 'eslint-disable' + | 'eslint-disable-line' + | 'eslint-disable-next-line' + | 'eslint-enable' + | 'eslint-env' + | 'exported' + | 'global' + | 'globals' + )[]; +} + +/** + * Options. + */ +export type RequireDescriptionOptions = [RequireDescriptionOption?]; + +/** + * Require include descriptions in ESLint directive-comments. + * + * @see [require-description](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/require-description.html) + */ +export type RequireDescriptionRuleConfig = + RuleConfig; + +/** + * Require include descriptions in ESLint directive-comments. + * + * @see [require-description](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/require-description.html) + */ +export interface RequireDescriptionRule { + /** + * Require include descriptions in ESLint directive-comments. + * + * @see [require-description](https://mysticatea.github.io/eslint-plugin-eslint-comments/rules/require-description.html) + */ + 'eslint-comments/require-description': RequireDescriptionRuleConfig; +} diff --git a/src/rules/index.d.ts b/src/rules/index.d.ts index e005b71e..bf959e62 100644 --- a/src/rules/index.d.ts +++ b/src/rules/index.d.ts @@ -1,5 +1,6 @@ import type { DeprecationRules } from './deprecation'; import type { EslintRules } from './eslint'; +import type { EslintCommentsRules } from './eslint-comments'; import type { ImportRules } from './import'; import type { JSDocRules } from './jsdoc'; import type { JsoncRules } from './jsonc'; @@ -23,6 +24,7 @@ import type { VuePugRules } from './vue-pug'; export type Rules = Partial< DeprecationRules & EslintRules & + EslintCommentsRules & ImportRules & JSDocRules & JsoncRules &