refactoring-codemods
Quest for IDE refactoring support within JavaScript via jscodeshift codemods.
Refactoring a large JavaScript codebase is no fun. Moving files around, renaming files or renaming exported functions simply breaks all dependents import/require paths, and is a huge pain to correct. Simple search and replace is NOT a good solution.
Codemods to the rescue 🚀 With the power of an AST we can determine which files in our project have previously depended on either the rename/moved file or renamed export, and automatically update the dependent code.
Three transforms are provided as low-level AST transforms for achieve either a file rename/move or a file export rename.
The API of this library is designed to be integrated with an IDE that leverages these transforms to update user code transparently.
Install
Install codemods via npm:
> yarn add refactoring-codemods
Transforms
import-declaration-transform
Fix all dependent import/require paths when a file has been renamed/moved.
Call this transform on your source/test files and all dependents import/require paths will be updated to match the new file name/location.
Note: prevFilePath and nextFilePath are absolute
> jscodeshift \ -t import-declaration-transform \ fileA fileB \ --prevFilePath=/Users/jurassix/example/bar.js \ --nextFilePath=/Users/jurassix/example/new/path/to/bar.js
Example:
;
becomes
;
import-relative-transform
Fix all relative import/require paths when a file has been renamed/moved.
Call this transform on the single file that is being moved to a new location and all relative import/require paths will be updated to match the new file name/location.
Note: prevFilePath and nextFilePath are absolute
> jscodeshift \ -t import-relative-transform \ bar.js \ --prevFilePath=/Users/jurassix/example/old/path/to/bar.js \ --nextFilePath=/Users/jurassix/example/new/path/to/bar.js
Example:
;
becomes
;
import-specifier-transform
Fix all dependent import/require variables when a file export been renamed.
Call this transform on your source/test files and all dependents import/require variables will be updated to match the new file export name.
Note: declarationFilePath is absolute
> jscodeshift \ -t fileA fileB \ --prevSpecifier=foo \ --nextSpecifier=fooPrime \ --declarationFilePath=/Users/jurassix/example/barjs
Example:
; ;
becomes
; ;
Contribute
Build
> yarn build
Run tests
> yarn test