Automatically migrate your custom ESLint rules from v8 to v9 format.
Overview
This codemod transforms your custom ESLint rules to be compatible with ESLint v9. It handles all breaking changes in the custom rule API, including context method removals, new rule structure requirements, and deprecated APIs.
ES Modules: export default function(context) { ... }
What This Codemod Does
This codemod performs a comprehensive migration of custom ESLint rules from v8 to v9. It handles the following breaking changes from the official ESLint v9 migration guide:
✅ Removed multiple context methods - migrates to sourceCode equivalents
✅ Removed context.getComments() - converts to combination of getCommentsBefore/Inside/After
HandlescurrentSegments API changes by adding necessary code path tracking
Detects fixable rules and adds fixable: "code" to meta
Usage
Migrate Custom Rules
Run the codemod and provide paths to your rule files or directories:
bash
npx codemod @eslint/v8-to-v9-custom-rules
# Or run locally
npx codemod workflow run -w workflow.yaml
Manual Steps Required
After running this codemod, you need to:
Review TODO comments - If your rule uses context.options, the codemod may leave a schema placeholder:
TODO Comment
Action Required
// TODO: Define schema - this rule uses context.options
Define a proper JSON schema for your rule's options
Fix schema for rules using options - If your rule uses context.options, you must define the schema:
javascript
// Before (generated with TODO)
schema: [] // TODO: Define schema - this rule uses context.options
// After (manually fixed)
schema: [
{
type: 'integer',
minimum: 1,
},
]
Verify scope-related migrations - The codemod automatically migrates getScope, getAncestors, and markVariableAsUsed with inferred node parameters. It does not leave TODO comments for these. Review the output to confirm the inferred node is correct, especially in nested helpers or non-standard visitor signatures. Parameterless visitors such as Program() {} get (node) injected automatically.
For getAncestors, the codemod also adds a v8 compatibility fallback: