ESLint Plugin ESLint Plugin is a comprehensive ESLint plugin designed specifically for linting ESLint plugins themselves. It provides 32 specialized rules divided into two categories: 26 rules for linting ESLint rule files and 6 rules for linting ESLint test files. The rules ensure code quality and consistency in ESLint rule development, supporting rules written in CommonJS, ES modules, and TypeScript.
npm install eslint-plugin-eslint-plugin --save-devimport eslintPlugin from 'eslint-plugin-eslint-plugin';For CommonJS:
const eslintPlugin = require('eslint-plugin-eslint-plugin');// eslint.config.js
import eslintPlugin from 'eslint-plugin-eslint-plugin';
export default [
eslintPlugin.configs.recommended,
{
files: ['lib/rules/*.js'],
rules: {
'eslint-plugin/require-meta-type': 'error',
'eslint-plugin/require-meta-docs-url': 'error'
}
}
];For legacy .eslintrc configuration:
{
"plugins": ["eslint-plugin"],
"extends": ["plugin:eslint-plugin/recommended"],
"rules": {
"eslint-plugin/require-meta-type": "error"
}
}ESLint Plugin ESLint Plugin is built around several key components:
Core plugin object with metadata, rules, and preset configurations for various ESLint plugin development scenarios.
interface ESLintPlugin {
meta: {
name: string;
version: string;
};
rules: Record<string, Rule.RuleModule>;
configs: {
all: Linter.Config;
'all-type-checked': Linter.Config;
recommended: Linter.Config;
rules: Linter.Config;
tests: Linter.Config;
'rules-recommended': Linter.Config;
'tests-recommended': Linter.Config;
};
}26 specialized rules for linting ESLint rule files, ensuring proper metadata, message handling, and best practices.
// Key rule examples
const rules = {
'require-meta-type': Rule.RuleModule;
'require-meta-docs-url': Rule.RuleModule;
'no-deprecated-context-methods': Rule.RuleModule;
'prefer-message-ids': Rule.RuleModule;
'require-meta-schema': Rule.RuleModule;
// ... 19 more rules
};6 specialized rules for linting ESLint test files, ensuring test case consistency and proper test structure.
// Key test rules
const testRules = {
'consistent-output': Rule.RuleModule;
'no-identical-tests': Rule.RuleModule;
'no-only-tests': Rule.RuleModule;
'test-case-property-ordering': Rule.RuleModule;
'test-case-shorthand-strings': Rule.RuleModule;
'prefer-output-null': Rule.RuleModule;
};Comprehensive helper functions for analyzing ESLint rule code, extracting metadata, and working with AST nodes.
// Core utility functions
function getRuleInfo(sourceCode: {
ast: Program;
scopeManager: Scope.ScopeManager;
}): RuleInfo | null;
function getTestInfo(
context: Rule.RuleContext,
ast: Program
): TestInfo[];
function getContextIdentifiers(
scopeManager: Scope.ScopeManager,
ast: Program
): Set<Identifier>;interface RuleInfo {
create: FunctionExpression | ArrowFunctionExpression | FunctionDeclaration;
isNewStyle: boolean;
meta?: Expression | Pattern | FunctionDeclaration;
}
interface TestInfo {
invalid: (Expression | SpreadElement | null)[];
valid: (Expression | SpreadElement | null)[];
}
interface FunctionInfo {
codePath: Rule.CodePath | null;
hasReturnWithFixer?: boolean;
hasYieldWithFixer?: boolean;
node: Node | null;
shouldCheck: boolean;
upper: FunctionInfo | null;
}
interface ViolationAndSuppressionData {
messageId?: Expression | SpreadElement | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern;
message?: Expression | SpreadElement | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern;
data?: Expression | SpreadElement | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern;
fix?: Expression | SpreadElement | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern;
}
interface MetaDocsProperty {
docsNode: Property | undefined;
metaNode: Node | undefined;
metaPropertyNode: Property | undefined;
}