This repository contains a collection of codemod scripts for use with JSCodeshift + it can also be added as a package to use the other transformers it exposes
npm install -g jscodeshift
git clone https://github.com/anshckr/fix-js.git
jscodeshift -t <codemod-script> <file>Use the -d option for a dry-run and use -p to print the output for
comparison.
Options to recast's printer can be provided through the printOptions command line argument
jscodeshift -t transform.js <file> --printOptions='{"quote":"double"}'Fixes eslint no-lonely-if rule
jscodeshift -t ./transforms/no-lonely-if.js <file>else {
if (someCondition) {
...
} else {
...
}
}The above will get converted to
else if (someCondition) {
...
} else {
...
}Fixes eslint no-nested-ternary rule by converting the nested ConditionalExpressions into an IIFE block with If/Else Statements
jscodeshift -t ./transforms/no-nested-ternary.js <file>a ? 'a' : b ? 'b' : 'c'The above will get converted to
(function() {
if (a) {
return 'a';
}
if (b) {
return 'b';
}
return 'c';
})()Fixes eslint no-unused-vars rule. Adds disable comment/block wherever the function/variable getting fixed is globally exposed
jscodeshift -t ./transforms/no-unused-vars.js <file>function someFunc(index) {}
var someUsedVar = 0, someUnUsedVar = false;
var someVar = (function(){
var someInternalVar;
function someInternalFunc() {};
someUsedVar = 1;
return someUsedVar;
})();The above will get converted to
// eslint-disable-next-line no-unused-vars
function someFunc() {}
var someUsedVar = 0;
window.someUnUsedVar = false;
window.someVar = (function(){
someUsedVar = 1;
return someUsedVar;
})();--skip-disable-comments=true: Doesn't add eslint disable comment/block to globals exposed
Transforms all named export actions use 'as' while importing. Also converts the 'bindActionCreators' objectExpressionNode to use the as imported action
jscodeshift -t ./transforms/react-action-as.js <file>import { someAction } from '../actions';
const mapDispatchToProps = (dispatch) =>
bindActionCreators(
{
someAction
},
dispatch
);The above will get converted to
import { someAction as someActionAction } from '../actions';
const mapDispatchToProps = (dispatch) =>
bindActionCreators(
{
someAction: someActionAction
},
dispatch
);Transformer to fix react/destructuring-assignment rule
jscodeshift -t ./transforms/react-destruct-assign.js <file>render() {
if (this.props.someProp) {
return this.state.someState;
}
}The above will get converted to
render() {
const { someProp } = this.props;
const { someState } = this.state;
if (someProp) {
return someState;
}
}Transformer that moves all the variable declarators to their scope level
jscodeshift -t ./transforms/block-scoped-var.js <file>function someFunc() {
if (someCondition) {
var i = 1;
} else {
var i = 2;
}
for (var j = 0; j < i; j++) {
...
}
for (var k in someObj) {
...
}
}The above will get converted to
function someFunc() {
var i, j, k;
if (someCondition) {
i = 1;
} else {
i = 2;
}
for (j = 0; j < i; j++) {
...
}
for (k in someObj) {
...
}
}Transformer to fix all the non camel cased variables and function names in a JS file
jscodeshift -t ./transforms/no-camelcase.js <file>--fix-exposed-functions=true: Fixes non camel-cased functions that are exposed from the file
--fix-dependencies=true: Finds all the dependencies needed by the file and fixes them if they are not camel-cased
var _some_var, $some_var;
function some_func() {}
some_func();The above will get converted to (with no options passed)
var someVar, $someVar;
function some_func() {}
some_func();$ npm i @anshckr/fix-jsIn Node.js:
var {
fixJSsAtPath,
transformLeakingGlobalsVars,
transformUnusedAssignedVars,
transformNoUnderscoreDangle
} = require('@anshckr/fix-js');| Parameter | Type | Description |
|---|---|---|
dirPath |
String |
Required. The directory path where you want to run the transform at |
transformer |
Function |
Required. The transformer which will modify the JS files |
paramsIgnoreFilesRegex |
Regex |
Optional. Regular expression to match file names to ignore during transform. Default: /$^/ |
paramsIgnoreFoldersRegex |
Regex |
Optional. Regular expression to match folder names to ignore during transform. Default: /$^/ |
paramsIgnoreableExternalDeps |
Array |
Optional. Array of dependencies to ignore during transform. Default: [] |
| Parameter | Type | Description |
|---|---|---|
filePath |
String |
Required. The file path you want to fix |
dependencies |
Function |
Optional. Array of dependencies you want to fix for the file at filePath. Default: All the global dependencies for the file |
updateInplace |
Boolean |
Optional. Whether to update the file or not. Default: false |
Returns
| Type | Description |
|---|---|
String |
Transformed file content |
Example
for (i = 0; i < 10; i++) {....}In the above code if we don't declare i in the upper scope like var i then i becomes a global leak
The utility will declare these types leaking variables
3. transformUnusedAssignedVars (Transformer to fix all the unused assigned variables from a JS file)
| Parameter | Type | Description |
|---|---|---|
filePath |
String |
Required. The file path you want to fix |
updateInplace |
Boolean |
Optional. Whether to update the file or not. Default: false |
Returns
| Type | Description |
|---|---|
String |
Transformed file content |
4. transformNoUnderscoreDangle (Transformer to fix leading '__' in function names to "_", removes "_" from function params)
| Parameter | Type | Description |
|---|---|---|
filePath |
String |
Required. The file path you want to fix |
updateInplace |
Boolean |
Optional. Whether to update the file or not. Default: false |
collectedGlobals |
Object |
Optional. Contains two keys globalsExposed, dependencies for the file. Default: {} |
Returns
| Type | Description |
|---|---|
String |
Transformed file content |
Example
function __someFunc(_someParam) {
..._someParam
}
__someFunc();The above will get converted to
function _someFunc(someParam) {
...someParam
}
_someFunc();Refer the example folder
Contributions, issues and feature requests are welcome!
Feel free to check issues page. You can also take a look at the contributing guide.
Give a ⭐️ if this project helped you!
@anshckr/fix-js is freely distributable under the terms of the MIT license