jscodeshift codemod development best practices from Facebook/Meta. This skill should be used when writing, reviewing, or debugging jscodeshift codemods...
Comprehensive best practices guide for jscodeshift codemod development, designed for AI agents and LLMs. Contains 40 rules across 8 categories, prioritized by impact from critical (parser configuration, AST traversal) to incremental (advanced patterns). Each rule includes detailed explanations, real-world examples, and specific impact metrics.
Reference these guidelines when:
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Parser Configuration | CRITICAL | parser- |
| 2 | AST Traversal Patterns | CRITICAL | traverse- |
| 3 | Node Filtering | HIGH | filter- |
| 4 | AST Transformation | HIGH | transform- |
| 5 | Code Generation | MEDIUM | codegen- |
| 6 | Testing Strategies | MEDIUM | test- |
| 7 | Runner Optimization | LOW-MEDIUM | runner- |
| 8 | Advanced Patterns | LOW | advanced- |
parser-typescript-config - Use correct parser for TypeScript filesparser-flow-annotation - Use Flow parser for Flow-typed codeparser-babel5-compat - Avoid default babel5compat for modern syntaxparser-export-declaration - Export parser from transform moduleparser-astexplorer-match - Match AST Explorer parser to jscodeshift parsertraverse-find-specific-type - Use specific node types in find() callstraverse-two-pass-pattern - Use two-pass pattern for complex transformstraverse-early-return - Return early when no transformation neededtraverse-find-filter-pattern - Use find() with filter object over filter() chaintraverse-closest-scope - Use closestScope() for scope-aware transformstraverse-avoid-repeated-find - Avoid repeated find() calls for same node typefilter-path-parent-check - Check parent path before transformationfilter-import-binding - Track import bindings for accurate usage detectionfilter-nullish-checks - Add nullish checks before property accessfilter-jsx-context - Distinguish JSX context from regular JavaScriptfilter-computed-properties - Handle computed property keys in filterstransform-builder-api - Use builder API for creating AST nodestransform-replacewith-callback - Use replaceWith callback for context-aware transformstransform-insert-import - Insert imports at correct positiontransform-preserve-comments - Preserve comments when replacing nodestransform-renameto - Use renameTo for variable renamingtransform-remove-unused-imports - Remove unused imports after transformationcodegen-tosource-options - Configure toSource() for consistent formattingcodegen-preserve-style - Preserve original code style with recastcodegen-template-literals - Use template literals for complex node creationcodegen-print-width - Set appropriate print width for long linestest-inline-snapshots - Use defineInlineTest for input/output verificationtest-negative-cases - Write negative test cases firsttest-dry-run-exploration - Use dry run mode for codebase explorationtest-fixture-files - Use fixture files for complex test casestest-parse-errors - Test for parse error handlingrunner-parallel-workers - Configure worker count for optimal parallelizationrunner-ignore-patterns - Use ignore patterns to skip non-source filesrunner-extensions-filter - Filter files by extensionrunner-batch-processing - Process large codebases in batchesrunner-verbose-output - Use verbose output for debugging transformsadvanced-compose-transforms - Compose multiple transforms into pipelinesadvanced-scope-analysis - Use scope analysis for safe variable transformsadvanced-multi-file-state - Share state across files with optionsadvanced-custom-collections - Create custom collection methodsRead individual reference files for detailed explanations and code examples:
For a single comprehensive document containing all rules, see AGENTS.md.
| File | Description |
|---|---|
| AGENTS.md | Complete compiled guide with all rules |
| references/_sections.md | Category definitions and ordering |
| assets/templates/_template.md | Template for new rules |
| metadata.json | Version and reference information |